mySQL學(xué)習(xí)記錄

基礎(chǔ)知識:

數(shù)據(jù)庫:存儲數(shù)據(jù)的倉庫,本質(zhì)是一個文件系統(tǒng),數(shù)據(jù)庫按照特定的格式將數(shù)據(jù)存儲起來。
常用數(shù)據(jù)庫:MySQL、Oracle

  • MySQL:開源免費(fèi)的數(shù)據(jù)庫,小型的數(shù)據(jù)庫已經(jīng)被Oracle收購了。
  • Oracle:收費(fèi)的大型數(shù)據(jù)庫,Oracle公司的產(chǎn)品。Oracle收購SUN公司,收購MySQL。
  • DB2:IBM公司的數(shù)據(jù)庫產(chǎn)品,收費(fèi)的。常用在銀行系統(tǒng)。
  • SQL server:Microsoft公司收費(fèi)的中型的數(shù)據(jù)庫。c#、.net等語言常使用。
  • SyBase:已經(jīng)淡出歷史舞臺。提供了一個非常專業(yè)數(shù)據(jù)建模的工具PowerDesigner。
  • SQLite:嵌入式的小型數(shù)據(jù)庫,應(yīng)用在手機(jī)端。

數(shù)據(jù)庫管理系統(tǒng)(DataBase Management System,DBMS):指一種操作和管理數(shù)據(jù)庫的大型軟件,用于建立、使用和維護(hù)數(shù)據(jù)庫,對數(shù)據(jù)庫進(jìn)行統(tǒng)一管理和控制,以保證數(shù)據(jù)庫的安全性和完整性。

數(shù)據(jù)庫整體示意圖

MySQL安裝成功后,數(shù)據(jù)庫中會存在一些默認(rèn)數(shù)據(jù)庫,是默認(rèn)生成的,不要去刪除,刪除后無法找回。

什么是SQL:結(jié)構(gòu)化查詢語言(Structured Query Language),簡稱SQL, SQL語句就是對數(shù)據(jù)庫進(jìn)行操作的一種語言。
SQL是數(shù)據(jù)庫管理系統(tǒng)都需要遵循的規(guī)范。不同的數(shù)據(jù)庫生產(chǎn)廠商都支持SQL語句,但都有特有內(nèi)容。

sql

SQL通用語法(規(guī)范)

  • SQL語句可以單行或多行書寫,以分號結(jié)尾。
  • 可使用空格和縮進(jìn)來增強(qiáng)語句的可讀性。(多個空格和縮進(jìn)也可以)
  • MySQL數(shù)據(jù)庫的SQL語句不區(qū)分大小寫,關(guān)鍵字建議使用大寫。 SELECT * FROM student; ---底層對于關(guān)鍵字會轉(zhuǎn)換成大寫。

SQL比較運(yùn)算符

>大于
<小于
<=小于等于
>=大于等于
=等于
<>、!=不等于

MySQL數(shù)據(jù)庫約束:

主鍵約束
唯一約束
非空約束

SQL邏輯運(yùn)算符

and 多個條件同時滿足
or 多個條件其中一個滿足
not 不滿足

MySQL數(shù)據(jù)類型:

類型 描述
int 整型(默認(rèn)11個長度)
double 浮點(diǎn)型
varchar 字符串型
data 日期類型:yyyy-MM-dd

詳細(xì)的數(shù)據(jù)類型如下(不建議詳細(xì)閱讀!)

分類 類型名稱 說明
整數(shù)類型 tinyInt 很小的整數(shù)
? smallint 小的整數(shù)
? mediumint 中等大小的整數(shù)
? int(integer) 普通大小的整數(shù)
小數(shù)類型 float 單精度浮點(diǎn)數(shù)
? double 雙精度浮點(diǎn)數(shù)
? decimal(m,d) 壓縮嚴(yán)格的定點(diǎn)數(shù)
日期類型 year YYYY 1901~2155
? time HH:MM:SS -838:59:59~838:59:59
? date YYYY-MM-DD 1000-01-01~9999-12-3
? datetime YYYY-MM-DD HH:MM:SS 1000-01-01 00:00:00~ 9999-12-31 23:59:59
? timestamp YYYY-MM-DD HH:MM:SS 19700101 00:00:01 UTC~2038-01-19 03:14:07UTC
文本、二進(jìn)制類型 CHAR(M) M為0~255之間的整數(shù) --適合存儲性別等已知長度且穩(wěn)定的數(shù)據(jù)
? VARCHAR(M) M為0~65535之間的整數(shù) (沒有默認(rèn)的長度值)
? TINYBLOB 允許長度0~255字節(jié)
? BLOB 允許長度0~65535字節(jié)
? MEDIUMBLOB 允許長度0~167772150字節(jié)
? LONGBLOB 允許長度0~4294967295字節(jié)
? TINYTEXT 允許長度0~255字節(jié)
? TEXT 允許長度0~65535字節(jié)
? MEDIUMTEXT 允許長度0~167772150字節(jié)
? LONGTEXT 允許長度0~4294967295字節(jié)
? VARBINARY(M) 允許長度0~M個字節(jié)的變長字節(jié)字符串
? BINARY(M) 允許長度0~M個字節(jié)的定長字節(jié)字符串

基礎(chǔ)常用語句:

創(chuàng)建db2數(shù)據(jù)庫,并使用:

CREATE DATABASE db2; 
USE db2;

庫:

CREATE DATABASE 數(shù)據(jù)庫名;   //創(chuàng)建數(shù)據(jù)庫  
SHOW DATABASES;             //查看所有數(shù)據(jù)庫
SELECT DATABASE();       //查看正在使用的數(shù)據(jù)庫
USE 數(shù)據(jù)庫名;        //使用/切換數(shù)據(jù)庫
SHOW CREATE DATABASE 數(shù)據(jù)庫名;          //查看指定數(shù)據(jù)庫的定義信息
DROP DATABASE 數(shù)據(jù)庫名;   //刪除數(shù)據(jù)庫
image.png

表:

CREATE TABLE 新表名 LIKE 舊表名;    //快速創(chuàng)建一個表結(jié)構(gòu)相同的表
CREATE TABLE 表名 (字段名1 字段類型1, 字段名2 字段類型2…);    //創(chuàng)建表
SHOW TABLES;   //查看此數(shù)據(jù)庫下所有的表
DESC 表名;     //查看表結(jié)構(gòu)
DROP TABLE 表名;  //刪除表
DROP TABLE IF EXISTS 表名;   //判斷表是否存在并刪除表
SHOW CREATE TABLE 表名;          //查看指定表定義信息


RENAME TABLE 表名 TO 新表名;    //修改表名
ALTER TABLE 表名 DROP 列名;    //刪除列 
INSERT INTO 表名 (字段名1, 字段名2, 字段名3…) VALUES (值1, 值2, 值3);   //插入數(shù)據(jù)


INSERT INTO 表名1 SELECT * FROM 表名2;   //將表名2中的數(shù)據(jù)復(fù)制到表名1中

//如果只想復(fù)制student表中name,age字段數(shù)據(jù)到student2表中使用如下格式
INSERT INTO student2(name,age) SELECT name,age FROM student;

//不帶條件修改數(shù)據(jù)
UPDATE 表名 SET 字段名=值;   
UPDATE student SET sex='女';

//帶條件修改數(shù)據(jù): 
UPDATE 表名 SET 字段名=值 WHERE 字段名=值;
UPDATE student SET sex='男' WHERE id=2;

//一次修改多個列,把id為3的學(xué)生,年齡改成26歲,address改成北京
UPDATE student SET age=26, address='北京' WHERE id=3;

//帶條件刪除數(shù)據(jù),刪除id為3的記錄
DELETE FROM student WHERE id=3;

查:

SELECT * FROM student;
SELECT id,name,age,sex,address,phone,birthday,math,english FROM student;

//查詢時給列、表指定別名需要使用AS關(guān)鍵字,  注意:AS可以省略不寫  
SELECT 字段名1 AS 別名, 字段名2 AS 別名... FROM 表名;


//查詢指定列并且結(jié)果不出現(xiàn)重復(fù)數(shù)據(jù): 
SELECT DISTINCT 字段名 FROM 表名;

//查詢name,age列并且結(jié)果不出現(xiàn)重復(fù)name:   
SELECT DISTINCT NAME, age FROM student;

//查詢math + english的和
SELECT math + english FROM student;

//查詢math + english的和使用別名”總成績”
SELECT math + english 總成績 FROM student;

//查詢所有列與math + english的和并使用別名”總成績”
SELECT *, math + english 總成績 FROM student;

其他語句:SQL標(biāo)準(zhǔn)中的Join的類型

  • 內(nèi)連接 INNER
  • 全外連接 FULL OUTER
  • 左外連接 LEFT OUTER
  • 右外連接 RIGHT OUTER
  • 交叉連接 CROSS

inner join 用于將兩張表(A和B表)的列組合在一起,產(chǎn)生新的結(jié)果表。

SQL語句分類:

1.DDL(Data Definition Language)數(shù)據(jù)定義語言

用來定義數(shù)據(jù)庫對象:數(shù)據(jù)庫,表,列等。關(guān)鍵字:create, drop(刪除),alter(修改)等

2.DML(Data Manipulation Language)數(shù)據(jù)操作語言

用來對數(shù)據(jù)庫中表的數(shù)據(jù)進(jìn)行增刪改。關(guān)鍵字:insert(增加), delete(刪除), update(修改)等

3.DQL(Data Query Language)數(shù)據(jù)查詢語言

用來查詢數(shù)據(jù)庫中表的記錄(數(shù)據(jù))。關(guān)鍵字:select, where等

4.DCL(Data Control Language)數(shù)據(jù)控制語言(了解)

用來定義數(shù)據(jù)庫的訪問權(quán)限和安全級別,及創(chuàng)建用戶。關(guān)鍵字:GRANT, REVOKE等

各種SQL語句用法:

1.DDL(Data Definition Language)語句,數(shù)據(jù)定義語言

1.1DDL語句操作數(shù)據(jù)庫

1.1.1創(chuàng)建數(shù)據(jù)庫

//1.1.1.1直接創(chuàng)建數(shù)據(jù)庫
CREATE DATABASE 數(shù)據(jù)庫名;   
CREATE DATABASE db1;

//1.1.1.2判斷是否存在并創(chuàng)建數(shù)據(jù)庫
CREATE DATABASE IF NOT EXISTS 數(shù)據(jù)庫名;
CREATE DATABASE IF NOT EXISTS db2;

//1.1.1.3創(chuàng)建數(shù)據(jù)庫并指定字符集(編碼表)  
//數(shù)據(jù)庫安裝的時候默認(rèn)使用的是UTF形式(萬國形式)的,gdk是TUF8的一個子集,屬于中國的,包含大多數(shù)漢字。
CREATE DATABASE 數(shù)據(jù)庫名 CHARACTER SET 字符集;
CREATE DATABASE db3 CHARACTER SET gbk;

1.1.2修改數(shù)據(jù)庫

//修改數(shù)據(jù)庫字符集格式 
ALTER DATABASE 數(shù)據(jù)庫名 DEFAULT CHARACTER SET 字符集;

//將db3數(shù)據(jù)庫的字符集改成utf8
ALTER DATABASE db3 DEFAULT CHARACTER SET utf8;

1.1.3刪除數(shù)據(jù)庫

DROP DATABASE 數(shù)據(jù)庫名;
DROP DATABASE db2;

1.1.4使用數(shù)據(jù)庫

//1.1.4.1查看正在使用的數(shù)據(jù)庫: 
SELECT DATABASE();

//1.1.4.2使用/切換數(shù)據(jù)庫: 
USE 數(shù)據(jù)庫名;
USE db1;
1.2DDL語句操作表 >前提先使用某個數(shù)據(jù)庫

1.2.1創(chuàng)建表

CREATE TABLE 表名 (字段名1 字段類型1, 字段名2 字段類型2…);

CREATE TABLE 表名 (
字段名1 字段類型1, 
字段名2 字段類型2
);

//創(chuàng)建student表包含id,name,birthday字段
CREATE TABLE student (
      id INT,
      name VARCHAR(20),
      birthday DATE
);

1.2.2查看表

SHOW TABLES;

//查看表結(jié)構(gòu) 
DESC 表名;

//查看創(chuàng)建表:
SHOW CREATE TABLE 表名;

//快速創(chuàng)建一個表結(jié)構(gòu)相同的表
CREATE TABLE 新表名 LIKE 舊表名;

1.2.3刪除表

//直接刪除表:
DROP TABLE 表名;

//判斷表是否存在并刪除表:
DROP TABLE IF EXISTS 表名;

1.2.4修改表(修改表結(jié)構(gòu)使用不是很頻繁,只需要了解,等需要使用的時候再回來查即可)

//1.2.4.1添加表列:
ALTER TABLE 表名 ADD 列名 類型;
//為學(xué)生表添加一個新的字段remark,類型為varchar(20)
ALTER TABLE student ADD remark VARCHAR(20);   

//1.2.4.2修改列類型
ALTER TABLE 表名 MODIFY列名 新的類型;
//將student表中的remark字段的改成varchar(100)
ALTER TABLE student MODIFY remark VARCHAR(100);   

//1.2.4.3修改列名
 ALTER TABLE 表名 CHANGE 舊列名 新列名 類型;
//將student表中的remark字段名改成intro,類型varchar(30)
ALTER TABLE student CHANGE remark intro varchar(30);   

//1.2.4.4刪除列
ALTER TABLE 表名 DROP 列名;
//刪除student表中的字段intro
ALTER TABLE student DROP intro;   

//1.2.4.5修改表名
RENAME TABLE 表名 TO 新表名;
//將學(xué)生表student改名成student2
RENAME TABLE student TO student2; 

1.2.4.6修改字符集
ALTER TABLE 表名 character set 字符集;
 //將sutden2表的編碼修改成gbk
ALTER TABLE student2 character set gbk; 

2.DML(Data Query Language)語句

INSERT INTO 表名          //表示往哪張表中添加數(shù)據(jù)
(字段名1, 字段名2, …)      //要給哪些字段設(shè)置值
VALUES (值1, 值2, …);     //設(shè)置具體的值

注意:
值與字段必須對應(yīng),個數(shù)相同,類型相同
值的數(shù)據(jù)大小必須在字段的長度范圍內(nèi)
除了數(shù)值類型外,其它的字段類型的值必須使用引號引起。(建議單引號)
如果要插入空值,可以不寫字段,或者插入null

2.1插入全部字段

//所有的字段名都寫出來
INSERT INTO 表名 (字段名1, 字段名2, 字段名3…) VALUES (值1, 值2, 值3);

//向表中插入所有字段,所有的字段名都寫出來
INSERT INTO student(id,name,age,sex,address,phone,birthday,math,english)values(2,'小美',18,'女','上海市','18888888888','2011-12-12',65.5,99.2);

//不寫字段名
INSERT INTO 表名 VALUES (值1, 值2, 值3…);

2.2插入部分?jǐn)?shù)據(jù)

//沒有添加數(shù)據(jù)的字段會使用NULL
INSERT INTO 表名 (字段名1, 字段名2, ...) VALUES (值1, 值2, ...);
INSERT INTO student (id,name,age,sex,address)values(1,'張三',19,'男','北京市');

//不寫字段名
INSERT INTO student values(3,'小明',27,'男','深圳市','13333333333','2000-11-06',95.5,92);
image.png

2.3蠕蟲復(fù)制:在已有的數(shù)據(jù)基礎(chǔ)之上,將原來的數(shù)據(jù)進(jìn)行復(fù)制,插入到對應(yīng)的表中

//將表名2中的數(shù)據(jù)復(fù)制到表名1中
INSERT INTO 表名1 SELECT * FROM 表名2;
//將student表中的數(shù)據(jù)添加到student2表中
INSERT INTO student SELECT * FROM student2;

//如果只想復(fù)制student表中name,age字段數(shù)據(jù)到student2表中使用如下格式
INSERT INTO student2(name,age) SELECT name,age FROM student;

2.4更新表記錄

//不帶條件修改數(shù)據(jù)
UPDATE 表名 SET 字段名=值;
//帶條件修改數(shù)據(jù)
UPDATE 表名 SET 字段名=值 WHERE 字段名=值;

//不帶條件修改數(shù)據(jù),將所有的性別改成女
UPDATE student SET sex='女';
//帶條件修改數(shù)據(jù),將id號為2的學(xué)生性別改成男
UPDATE student SET sex='男' WHERE id=2;

//一次修改多個列,把id為3的學(xué)生,年齡改成26歲,address改成北京
UPDATE student SET age=26, address='北京' WHERE id=3;

2.5刪除表記錄

//不帶條件刪除數(shù)據(jù)
DELETE FROM 表名;
//帶條件刪除數(shù)據(jù)
DELETE FROM 表名 WHERE 字段名=值;

//帶條件刪除數(shù)據(jù),刪除id為3的記錄
DELETE FROM student WHERE id=3;
//不帶條件刪除數(shù)據(jù),刪除表中的所有數(shù)據(jù)
DELETE FROM student;

truncate刪除表記錄

 TRUNCATE TABLE 表名;

truncate和delete的區(qū)別
delete是將表中的數(shù)據(jù)一條一條刪除
truncate是將整個表摧毀,重新創(chuàng)建一個新的表,新的表結(jié)構(gòu)和原來表結(jié)構(gòu)一模一樣

3.DQL(Data Query Language)語句

3.1查詢表所有數(shù)據(jù)

SELECT * FROM 表名;
SELECT * FROM student;

3.2查詢指定列

SELECT 字段名1, 字段名2, 字段名3, ... FROM 表名;
SELECT id,name,age,sex,address,phone,birthday,math,english FROM student;

3.3別名查詢

//查詢時給列、表指定別名需要使用AS關(guān)鍵字
//使用別名的好處是方便觀看和處理查詢到的數(shù)據(jù)
//注意:AS可以省略不寫
SELECT 字段名1 AS 別名, 字段名2 AS 別名... FROM 表名;

//查詢sudent表中name 和 age 列,name列的別名為”姓名”,age列的別名為”年齡”:  
SELECT NAME AS 姓名, age AS 年齡 FROM student;

3.4清除重復(fù)值

//查詢指定列并且結(jié)果不出現(xiàn)重復(fù)數(shù)據(jù)
SELECT DISTINCT 字段名 FROM 表名;
//查詢name,age列并且結(jié)果不出現(xiàn)重復(fù)name:   
SELECT DISTINCT NAME, age FROM student;

3.5查詢結(jié)果參與運(yùn)算
參與運(yùn)算的必須是數(shù)值類型

//某列數(shù)據(jù)和固定值運(yùn)算:  
SELECT 列名1 + 固定值 FROM 表名;
//某列數(shù)據(jù)和其他列數(shù)據(jù)參與運(yùn)算:  
SELECT 列名1 + 列名2 FROM 表名;

//查詢math + english的和
SELECT math + english FROM student;
//查詢math + english的和使用別名”總成績”
SELECT math + english 總成績 FROM student;

//查詢所有列與math + english的和并使用別名”總成績”
SELECT *, math + english 總成績 FROM student;

查詢姓名、年齡,將每個人的年齡增加10歲
SELECT name, age + 10 FROM student;
查詢所有列與math + english的和并使用別名”總成績”
查詢姓名、年齡,將每個人的年齡增加10歲

3.6條件查詢

//查詢攻擊大于350的英雄
SELECT * FROM hero where attack>350;
//查詢不是熱門的英雄 1:熱門 0:非熱門
SELECT * FROM hero WHERE is_hot<>1;   SELECT * FROM hero WHERE is_hot!=1;

3.7 邏輯查詢

//查詢id是1或3或5的英雄
SELECT * FROM hero WHERE id=1 OR id=3 OR id=5;

3.8 in關(guān)鍵字
in里面的每個數(shù)據(jù)都會作為一次條件,只要滿足條件的就會顯示

//語法格式
SELECT 字段名 FROM 表名 WHERE 字段 in (數(shù)據(jù)1, 數(shù)據(jù)2...);

//查詢id是1或3或5的英雄
SELECT * FROM hero WHERE id in(1,3,5);
//查詢id不是1或3或5的英雄
SELECT * FROM hero WHERE id not in(1,3,5);

3.9范圍查詢
BETWEEN 值1 AND 值2 表示從值1到值2范圍,包頭又包尾

//查詢英雄上架日期大于等于2013-01-01小于等于2017-01-01之間的英雄
SELECT * FROM hero WHERE grounding_date BETWEEN '2013-01-01' AND '2017-01-01';
SELECT * FROM hero WHERE grounding_date >='2013-01-01'  AND grounding_date<='2017-01-01';

3.10模糊查詢

MySQL通配符有兩個:
%: 表示0個或多個字符(任意個字符)
_: 表示一個字符

//LIKE表示模糊查詢
SELECT * FROM 表名 WHERE 字段名 LIKE '通配符字符串';

//查詢姓孫的英雄
SELECT * FROM hero WHERE name LIKE '孫%';

//查詢姓名中包含’孫’字的英雄
SELECT * FROM hero WHERE name LIKE '%孫%';

//查詢姓孫,且姓名有三個字的英雄
SELECT * FROM hero WHERE name LIKE '孫__';

3.11排序查詢
通過ORDER BY子句,可以將查詢出的結(jié)果進(jìn)行排序(排序只是顯示方式,不會影響數(shù)據(jù)庫中數(shù)據(jù)的順序)
ASC: 升序, 默認(rèn)是升序
DESC: 降序

SELECT 字段名 FROM 表名 WHERE 字段=值 ORDER BY 字段名 [ASC|DESC];

單列排序
//查詢年齡小于等于35歲的英雄,按照年齡升序排列
SELECT * FROM hero WHERE age<=35 ORDER BY age ASC;


組合排序:組合排序就是先按第一個字段進(jìn)行排序,如果第一個字段相同,才按第二個字段進(jìn)行排序,依次類推。
//查詢年齡小于等于35歲的英雄,按照年齡升序排列,如果年齡相同按照生命的降序排列
SELECT * FROM hero WHERE age<=35 ORDER BY age ASC,life desc;

3.12聚合函數(shù)
之前我們做的查詢都是橫向查詢,它們都是根據(jù)條件一行一行的進(jìn)行判斷,而使用聚合函數(shù)查詢是縱向查詢,它是對一列的值進(jìn)行計算,然后返回一個結(jié)果值。另外聚合函數(shù)會忽略空值.
五個聚合函數(shù):
count: 統(tǒng)計指定列記錄數(shù),記錄為NULL的不統(tǒng)計
sum: 計算指定列的數(shù)值和,如果不是數(shù)值類型,那么計算結(jié)果為0
max: 計算指定列的最大值
min: 計算指定列的最小值
avg: 計算指定列的平均值,如果不是數(shù)值類型,那么計算結(jié)果為0
聚合函數(shù)的使用:寫在 SQL語句SELECT后 字段名的地方

SELECT 字段名... FROM 表名;
SELECT COUNT(age) FROM 表名;

//查詢英雄總數(shù)
SELECT COUNT(max_score) FROM hero  //我們發(fā)現(xiàn)對于NULL的記錄不會統(tǒng)計

//只要使用全部字段作為衡量標(biāo)準(zhǔn)既不會有遺漏的錯誤統(tǒng)計出現(xiàn)
SELECT COUNT(*) FROM hero

//查詢年齡大于40的總數(shù)
SELECT COUNT(*) FROM hero WHERE age>35;


//查詢所用英雄的總評分
SELECT SUM(max_score) FROM hero

//查詢英雄評分的平均分
SELECT AVG(max_score) FROM hero

查詢英雄評分的最高分
SELECT MAX(max_score) FROM hero

3.13分組
分組查詢是指使用 GROUP BY語句對查詢信息進(jìn)行分組,相同數(shù)據(jù)作為一組
GROUP BY怎么分組的?將分組字段結(jié)果中相同內(nèi)容作為一組

SELECT 字段1,字段2... FROM 表名 GROUP BY 分組字段 [HAVING 條件];


//這句話會將sex相同的數(shù)據(jù)作為一組,但是會返回每組的第一條,沒有任何意義
SELECT * FROM hero GROUP BY sex;

分組的目的就是為了統(tǒng)計,一般分組會跟聚合函數(shù)一起使用。
分組后聚合函數(shù)不是操作所有數(shù)據(jù),而是操作一組數(shù)據(jù)。

SELECT SUM(life) FROM hero GROUP BY sex
image.png
//查詢年齡大于25歲的人,按性別分組,統(tǒng)計每組的人數(shù),并只顯示性別人數(shù)大于2的數(shù)據(jù)
//并只顯示性別人數(shù)>2的數(shù)據(jù)屬于分組后的條件,對于分組后的條件需要使用having子句
SELECT sex,count(*) FROM hero WHERE age<30 GROUP BY sex HAVING COUNT(*)>2;

having與where的區(qū)別

  • having是在分組后對數(shù)據(jù)進(jìn)行過濾.
  • where是在分組前對數(shù)據(jù)進(jìn)行過濾
  • having后面可以使用聚合函數(shù)
  • where后面不可以使用聚合函數(shù)

3.4 LIMIT語句
LIMIT是限制的意思,所以LIMIT的作用就是限制查詢記錄的條數(shù)。
LIMIT語法格式:
LIMIT offset,length; 或者limit length;
offset是指偏移量,可以認(rèn)為是跳過的記錄數(shù)量,默認(rèn)為0
length是指需要顯示的總記錄數(shù)

SELECT *|字段列表 [as 別名] FROM 表名 [WHERE子句] [GROUP BY子句][HAVING子句][ORDER BY子句][LIMIT子句];

//查詢hero表中數(shù)據(jù),從第三條開始顯示,顯示6條
SELECT * FROM student3 LIMIT 2,6;

LIMIT的使用場景:分頁

每頁顯示5條
//-- 第一頁: LIMIT 0,5;  跳過0條,顯示5條 
//-- 第二頁: LIMIT 5,5;  跳過5條,顯示5條
//-- 第三頁: LIMIT 10,5; 跳過10條,顯示5條
SELECT * FROM hero LIMIT 0,5;
SELECT * FROM hero LIMIT 5,5;
SELECT * FROM hero LIMIT 10,5;

注意:
如果第一個參數(shù)是0可以簡寫:
SELECT * FROM student3 LIMIT 0,5;
SELECT * FROM student3 LIMIT 5;
LIMIT 10,5; – 不夠5條,有多少顯示多少

4.DCL語句

4.1

數(shù)據(jù)約束

對表中的數(shù)據(jù)進(jìn)行進(jìn)一步的限制,保證數(shù)據(jù)的正確性有效性完整性。
約束種類:

  • PRIMARY KEY: 主鍵
  • UNIQUE: 唯一
  • NOT NULL: 非空
  • DEFAULT: 默認(rèn)
  • FOREIGN KEY: 外鍵

1主鍵約束 PRIMARY KEY

1.1主鍵的特點(diǎn)

  • 主鍵必須包含唯一的值
  • 主鍵列不能包含NULL值

1.2主鍵的作用

用來唯一標(biāo)識一條記錄,每個表都應(yīng)該有一個主鍵,并且每個表只能有一個主鍵。

1.3哪個字段應(yīng)該作為表的主鍵?

通常不用業(yè)務(wù)字段作為主鍵,單獨(dú)給每張表設(shè)計一個id的字段,把id作為主鍵。主鍵是給數(shù)據(jù)庫和程序使用的,不是給最終的客戶使用的。所以主鍵有沒有含義沒有關(guān)系,只要不重復(fù),非空就行。

1.4創(chuàng)建主鍵:

在創(chuàng)建表的時候給字段添加主鍵
字段名 字段類型 PRIMARY KEY

//創(chuàng)建英雄表hero1, 包含字段(id, name, age)將id做為主鍵
CREATE TABLE hero1(
    id int PRIMARY Key,
    name varchar(20),
    age int);
主鍵

1.5刪除主鍵:

ALTER TABLE 表名 DROP PRIMARY KEY;

//刪除hero1表的主鍵
ALTER TABLE hero1 DROP PRIMARY KEY;
主鍵已刪除

1.5自增主鍵:

主鍵如果讓我們自己添加很有可能重復(fù),我們通常希望在每次插入新記錄時,數(shù)據(jù)庫自動生成主鍵字段的值
AUTO_INCREMENT 表示自動增長(字段類型必須是整數(shù)類型)

創(chuàng)建英雄表hero2, 包含字段(id, name, age)將id做為主鍵并自動增長
CREATE TABLE hero2(
  id int PRIMARY Key AUTO_INCREMENT,
  name varchar(20),
  age int
);

默認(rèn)地AUTO_INCREMENT 的開始值是1,如果希望修改起始值,請使用下列SQL語法:
ALTER TABLE 表名 AUTO_INCREMENT=起始值;

DELETE和TRUNCATE的區(qū)別
DELETE 刪除表中的數(shù)據(jù),但不重置AUTO_INCREMENT的值。
TRUNCATE 摧毀表,重建表,AUTO_INCREMENT重置為1

2唯一約束 UNIQUE

2.1唯一約束的特點(diǎn)

在這張表中這個字段的值不能重復(fù)

2.2 唯一約束的基本格式

字段名 字段類型 UNIQUE

2.3 創(chuàng)建唯一約束

//創(chuàng)建英雄表hero3, 包含字段(id, name),name這一列設(shè)置唯一約束,不能出現(xiàn)同名的英雄
CREATE TABLE hero3 (
  id INT,
  NAME VARCHAR(20) UNIQUE
);

3非空約束 NOT NULL

這個字段必須設(shè)置值,不能是NULL

3.1創(chuàng)建非空約束

字段名 字段類型 NOT NULL

//創(chuàng)建表英雄表hero4, 包含字段(id,name,gender)其中name不能為NULL
CREATE TABLE hero4 (
    id INT,
    NAME VARCHAR(20) NOT NULL,
    gender CHAR(2)
);

4默認(rèn)值約束 DEFAULT

往表中添加數(shù)據(jù)時,如果不指定這個字段的數(shù)據(jù),就使用默認(rèn)值

3.1創(chuàng)建默認(rèn)值約束

字段名 字段類型 DEFAULT 默認(rèn)值

//創(chuàng)建一個英雄表 hero5,包含字段(id,name,location), 默認(rèn)的定位是射手
CREATE TABLE hero5 (
    id INT,
    NAME VARCHAR(20),
    location VARCHAR(50) DEFAULT '射手'
);

//添加一條記錄,使用默認(rèn)值
INSERT INTO hero5 (id, NAME) VALUES (1, '后羿');


//添加一條記錄,不使用默認(rèn)地址
INSERT INTO hero5 VALUES (2, '蘭陵王', '刺客');
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容