1. DQL:查詢語句
1. 排序查詢
2. 聚合函數(shù)
3. 分組查詢
4. 分頁查詢
2. 約束
3. 多表之間的關(guān)系
4. 范式
5. 數(shù)據(jù)庫的備份和還原
# DQL:查詢語句
1. 排序查詢
* 語法:order by 子句
* order by 排序字段1 排序方式1 饱苟,? 排序字段2 排序方式2...
select * from student order by math desc;
* 排序方式:
* ASC:升序撩笆,默認(rèn)的衡查。
* DESC:降序匙睹。
* 注意:
* 如果有多個(gè)排序條件宠叼,則當(dāng)前邊的條件值一樣時(shí)劫拢,才會判斷第二條件搓幌。
2. 聚合函數(shù):將一列數(shù)據(jù)作為一個(gè)整體,進(jìn)行縱向的計(jì)算。
1. count:計(jì)算個(gè)數(shù)
1. 一般選擇非空的列:主鍵
2. count(*)
2. max:計(jì)算最大值
3. min:計(jì)算最小值
4. sum:計(jì)算和
5. avg:計(jì)算平均值
* 注意:聚合函數(shù)的計(jì)算侨歉,排除null值屋摇。
解決方案:
1. 選擇不包含非空的列進(jìn)行計(jì)算
2. IFNULL函數(shù)
3. 分組查詢:
1. 語法:group by 分組字段;
2. 注意:
1. 分組之后查詢的字段:分組字段幽邓、聚合函數(shù)
2. where 和 having 的區(qū)別摊册?
1. where 在分組之前進(jìn)行限定,如果不滿足條件颊艳,則不參與分組茅特。having在分組之后進(jìn)行限定,如果不滿足結(jié)果棋枕,則不會被查詢出來
2. where 后不可以跟聚合函數(shù)白修,having可以進(jìn)行聚合函數(shù)的判斷。
-- 按照性別分組重斑。分別查詢男兵睛、女同學(xué)的平均分
SELECT sex , AVG(math) FROM student GROUP BY sex;
-- 按照性別分組。分別查詢男窥浪、女同學(xué)的平均分,人數(shù)
SELECT sex , AVG(math),COUNT(id) FROM student GROUP BY sex;
--? 按照性別分組。分別查詢男假颇、女同學(xué)的平均分,人數(shù) 要求:分?jǐn)?shù)低于70分的人笨鸡,不參與分組
SELECT sex , AVG(math),COUNT(id) FROM student WHERE math > 70 GROUP BY sex;
--? 按照性別分組形耗。分別查詢男激涤、女同學(xué)的平均分,人數(shù) 要求:分?jǐn)?shù)低于70分的人倦踢,不參與分組,分組之后硼一。人數(shù)要大于2個(gè)人
SELECT sex , AVG(math),COUNT(id) FROM student WHERE math > 70 GROUP BY sex HAVING COUNT(id) > 2;
SELECT sex , AVG(math),COUNT(id) 人數(shù) FROM student WHERE math > 70 GROUP BY sex HAVING 人數(shù) > 2;
4. 分頁查詢
1. 語法:limit 開始的索引,每頁查詢的條數(shù);
2. 公式:開始的索引 = (當(dāng)前的頁碼 - 1) * 每頁顯示的條數(shù)
-- 每頁顯示3條記錄
SELECT * FROM student LIMIT 0,3; -- 第1頁
SELECT * FROM student LIMIT 3,3; -- 第2頁
SELECT * FROM student LIMIT 6,3; -- 第3頁
3. limit 是一個(gè)MySQL"方言"
## 約束
* 概念: 對表中的數(shù)據(jù)進(jìn)行限定愧哟,保證數(shù)據(jù)的正確性、有效性和完整性霞赫。
* 分類:
1. 主鍵約束:primary key
2. 非空約束:not null
3. 唯一約束:unique
4. 外鍵約束:foreign key
* 非空約束:not null端衰,值不能為null
1. 創(chuàng)建表時(shí)添加約束
CREATE TABLE stu(
id INT,
NAME VARCHAR(20) NOT NULL -- name為非空
);
2. 創(chuàng)建表完后,添加非空約束
ALTER TABLE stu MODIFY NAME VARCHAR(20) NOT NULL;
3. 刪除name的非空約束
ALTER TABLE stu MODIFY NAME VARCHAR(20);
* 唯一約束:unique灭抑,值不能重復(fù)
1. 創(chuàng)建表時(shí)腾节,添加唯一約束
CREATE TABLE stu(
id INT,
phone_number VARCHAR(20) UNIQUE -- 添加了唯一約束
);
* 注意mysql中荤牍,唯一約束限定的列的值可以有多個(gè)null
2. 刪除唯一約束
ALTER TABLE stu DROP INDEX phone_number;
3. 在創(chuàng)建表后康吵,添加唯一約束
ALTER TABLE stu MODIFY phone_number VARCHAR(20) UNIQUE;
* 主鍵約束:primary key晦嵌。
1. 注意:
1. 含義:非空且唯一
2. 一張表只能有一個(gè)字段為主鍵
3. 主鍵就是表中記錄的唯一標(biāo)識
2. 在創(chuàng)建表時(shí)耍铜,添加主鍵約束
create table stu(
id int primary key,-- 給id添加主鍵約束
name varchar(20)
);
3. 刪除主鍵
-- 錯(cuò)誤 alter table stu modify id int ;
ALTER TABLE stu DROP PRIMARY KEY;
4. 創(chuàng)建完表后棕兼,添加主鍵
ALTER TABLE stu MODIFY id INT PRIMARY KEY;
5. 自動(dòng)增長:
1.? 概念:如果某一列是數(shù)值類型的伴挚,使用 auto_increment 可以來完成值得自動(dòng)增長
2. 在創(chuàng)建表時(shí)茎芋,添加主鍵約束颅眶,并且完成主鍵自增長
create table stu(
id int primary key auto_increment,-- 給id添加主鍵約束
name varchar(20)
);
3. 刪除自動(dòng)增長
ALTER TABLE stu MODIFY id INT;
4. 添加自動(dòng)增長
ALTER TABLE stu MODIFY id INT AUTO_INCREMENT;
* 外鍵約束:foreign key,讓表于表產(chǎn)生關(guān)系,從而保證數(shù)據(jù)的正確性涛酗。
1. 在創(chuàng)建表時(shí),可以添加外鍵
* 語法:
create table 表名(
....
外鍵列
constraint 外鍵名稱 foreign key (外鍵列名稱) references 主表名稱(主表列名稱)
);
2. 刪除外鍵
ALTER TABLE 表名 DROP FOREIGN KEY 外鍵名稱;
3. 創(chuàng)建表之后商叹,添加外鍵
ALTER TABLE 表名 ADD CONSTRAINT 外鍵名稱 FOREIGN KEY (外鍵字段名稱) REFERENCES 主表名稱(主表列名稱);
4. 級聯(lián)操作
1. 添加級聯(lián)操作
語法:ALTER TABLE 表名 ADD CONSTRAINT 外鍵名稱
FOREIGN KEY (外鍵字段名稱) REFERENCES 主表名稱(主表列名稱) ON UPDATE CASCADE ON DELETE CASCADE? ;
2. 分類:
1. 級聯(lián)更新:ON UPDATE CASCADE
2. 級聯(lián)刪除:ON DELETE CASCADE
## 數(shù)據(jù)庫的設(shè)計(jì)
1. 多表之間的關(guān)系
1. 分類:
1. 一對一(了解):
* 如:人和身份證
* 分析:一個(gè)人只有一個(gè)身份證,一個(gè)身份證只能對應(yīng)一個(gè)人
2. 一對多(多對一):
* 如:部門和員工
* 分析:一個(gè)部門有多個(gè)員工剖笙,一個(gè)員工只能對應(yīng)一個(gè)部門
3. 多對多:
* 如:學(xué)生和課程
* 分析:一個(gè)學(xué)生可以選擇很多門課程卵洗,一個(gè)課程也可以被很多學(xué)生選擇
2. 實(shí)現(xiàn)關(guān)系:
1. 一對多(多對一):
* 如:部門和員工
* 實(shí)現(xiàn)方式:在多的一方建立外鍵,指向一的一方的主鍵过蹂。
2. 多對多:
* 如:學(xué)生和課程
* 實(shí)現(xiàn)方式:多對多關(guān)系實(shí)現(xiàn)需要借助第三張中間表。中間表至少包含兩個(gè)字段榴啸,這兩個(gè)字段作為第三張表的外鍵鸥印,分別指向兩張表的主鍵
3. 一對一(了解):
* 如:人和身份證
* 實(shí)現(xiàn)方式:一對一關(guān)系實(shí)現(xiàn)库说,可以在任意一方添加唯一外鍵指向另一方的主鍵片择。
3. 案例
-- 創(chuàng)建旅游線路分類表 tab_category
-- cid 旅游線路分類主鍵字管,自動(dòng)增長
-- cname 旅游線路分類名稱非空啰挪,唯一,字符串 100
CREATE TABLE tab_category (
cid INT PRIMARY KEY AUTO_INCREMENT,
cname VARCHAR(100) NOT NULL UNIQUE
);
-- 創(chuàng)建旅游線路表 tab_route
/*
rid 旅游線路主鍵嘲叔,自動(dòng)增長
rname 旅游線路名稱非空亡呵,唯一,字符串 100
price 價(jià)格
rdate 上架時(shí)間硫戈,日期類型
cid 外鍵锰什,所屬分類
*/
CREATE TABLE tab_route(
rid INT PRIMARY KEY AUTO_INCREMENT,
rname VARCHAR(100) NOT NULL UNIQUE,
price DOUBLE,
rdate DATE,
cid INT,
FOREIGN KEY (cid) REFERENCES tab_category(cid)
);
/*創(chuàng)建用戶表 tab_user
uid 用戶主鍵,自增長
username 用戶名長度 100丁逝,唯一汁胆,非空
password 密碼長度 30,非空
name 真實(shí)姓名長度 100
birthday 生日
sex 性別霜幼,定長字符串 1
telephone 手機(jī)號嫩码,字符串 11
email 郵箱,字符串長度 100
*/
CREATE TABLE tab_user (
uid INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(100) UNIQUE NOT NULL,
PASSWORD VARCHAR(30) NOT NULL,
NAME VARCHAR(100),
birthday DATE,
sex CHAR(1) DEFAULT '男',
telephone VARCHAR(11),
email VARCHAR(100)
);
/*
創(chuàng)建收藏表 tab_favorite
rid 旅游線路 id罪既,外鍵
date 收藏時(shí)間
uid 用戶 id铸题,外鍵
rid 和 uid 不能重復(fù)铡恕,設(shè)置復(fù)合主鍵,同一個(gè)用戶不能收藏同一個(gè)線路兩次
*/
CREATE TABLE tab_favorite (
rid INT, -- 線路id
DATE DATETIME,
uid INT, -- 用戶id
-- 創(chuàng)建復(fù)合主鍵
PRIMARY KEY(rid,uid), -- 聯(lián)合主鍵
FOREIGN KEY (rid) REFERENCES tab_route(rid),
FOREIGN KEY(uid) REFERENCES tab_user(uid)
);
2. 數(shù)據(jù)庫設(shè)計(jì)的范式
* 概念:設(shè)計(jì)數(shù)據(jù)庫時(shí)回挽,需要遵循的一些規(guī)范没咙。要遵循后邊的范式要求猩谊,必須先遵循前邊的所有范式要求
設(shè)計(jì)關(guān)系數(shù)據(jù)庫時(shí)千劈,遵從不同的規(guī)范要求,設(shè)計(jì)出合理的關(guān)系型數(shù)據(jù)庫牌捷,這些不同的規(guī)范要求被稱為不同的范式墙牌,各種范式呈遞次規(guī)范,越高的范式數(shù)據(jù)庫冗余越小暗甥。
目前關(guān)系數(shù)據(jù)庫有六種范式:第一范式(1NF)喜滨、第二范式(2NF)、第三范式(3NF)撤防、巴斯-科德范式(BCNF)虽风、第四范式(4NF)和第五范式(5NF,又稱完美范式)寄月。
* 分類:
1. 第一范式(1NF):每一列都是不可分割的原子數(shù)據(jù)項(xiàng)
2. 第二范式(2NF):在1NF的基礎(chǔ)上辜膝,非碼屬性必須完全依賴于碼(在1NF基礎(chǔ)上消除非主屬性對主碼的部分函數(shù)依賴)
* 幾個(gè)概念:
1. 函數(shù)依賴:A-->B,如果通過A屬性(屬性組)的值,可以確定唯一B屬性的值漾肮。則稱B依賴于A
例如:學(xué)號-->姓名厂抖。? (學(xué)號,課程名稱) --> 分?jǐn)?shù)
2. 完全函數(shù)依賴:A-->B克懊, 如果A是一個(gè)屬性組忱辅,則B屬性值得確定需要依賴于A屬性組中所有的屬性值。
例如:(學(xué)號谭溉,課程名稱) --> 分?jǐn)?shù)
3. 部分函數(shù)依賴:A-->B墙懂, 如果A是一個(gè)屬性組,則B屬性值得確定只需要依賴于A屬性組中某一些值即可扮念。
例如:(學(xué)號垒在,課程名稱) -- > 姓名
4. 傳遞函數(shù)依賴:A-->B, B -- >C . 如果通過A屬性(屬性組)的值,可以確定唯一B屬性的值扔亥,在通過B屬性(屬性組)的值可以確定唯一C屬性的值场躯,則稱 C 傳遞函數(shù)依賴于A
例如:學(xué)號-->系名,系名-->系主任
5. 碼:如果在一張表中旅挤,一個(gè)屬性或?qū)傩越M踢关,被其他所有屬性所完全依賴,則稱這個(gè)屬性(屬性組)為該表的碼
例如:該表中碼為:(學(xué)號粘茄,課程名稱)
* 主屬性:碼屬性組中的所有屬性
* 非主屬性:除過碼屬性組的屬性
3. 第三范式(3NF):在2NF基礎(chǔ)上签舞,任何非主屬性不依賴于其它非主屬性(在2NF基礎(chǔ)上消除傳遞依賴)
## 數(shù)據(jù)庫的備份和還原
1. 命令行:
* 語法:
* 備份: mysqldump -u用戶名 -p密碼 數(shù)據(jù)庫名稱 > 保存的路徑
* 還原:
1. 登錄數(shù)據(jù)庫
2. 創(chuàng)建數(shù)據(jù)庫
3. 使用數(shù)據(jù)庫
4. 執(zhí)行文件秕脓。source 文件路徑