基礎(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ù)庫的安全性和完整性。

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通用語法(規(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ù)庫

表:
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);

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;


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

//查詢年齡大于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, '蘭陵王', '刺客');