DQL:查詢語句
排序查詢
-
語法:order by 子句
- order by 排序字段1 排序方式1 , 排序字段2 排序方式2…
-
排序方式:
- ASC:升序,默認的。
- DESC:降序。
-
注意:
- 如果有多個排序條件,則當前邊的條件值一樣時,纔會判斷第二條件。
select * from student order by math asc , english asc;
聚合函數:將一列數據作爲一個整體,進行縱向的計算。
- count:計算個數
- 一般選擇非空的列:主鍵
- count(*)
select count(name) from student;
- max:計算最大值
- min:計算最小值
- sum:計算和
- avg:計算平均值
- 注意:聚合函數的計算,排除null值。
- 解決方案:
- 選擇不包含非空的列進行計算
- IFNULL函數
- 解決方案:
select count(ifnull(english,0)) from student;
分組查詢:
- 語法:group by 分組字段;
- 注意:
- 分組之後查詢的字段:分組字段、聚合函數
where 和 having 的區別
- where 在分組之前進行限定,如果不滿足條件,則不參與分組。having在分組之後進行限定,如果不滿足結果,則不會被查詢出來
- where 後不可以跟聚合函數,having可以進行聚合函數的判斷。
-- 按照性別分組。分別查詢男、女同學的平均分
SELECT sex , AVG(math) FROM student GROUP BY sex;
-- 按照性別分組。分別查詢男、女同學的平均分,人數
SELECT sex , AVG(math),COUNT(id) FROM student GROUP BY sex;
-- 按照性別分組。分別查詢男、女同學的平均分,人數 要求:分數低於70分的人,不參與分組
SELECT sex , AVG(math),COUNT(id) FROM student WHERE math > 70 GROUP BY sex;
-- 按照性別分組。分別查詢男、女同學的平均分,人數 要求:分數低於70分的人,不參與分組,分組之後。人數要大於2個人
SELECT sex , AVG(math),COUNT(id) FROM student WHERE math > 70 GROUP BY sex HAVING COUNT(id) > 2;
SELECT sex , AVG(math),COUNT(id) 人數 FROM student WHERE math > 70 GROUP BY sex HAVING 人數 > 2;
分頁查詢
- 語法:limit 開始的索引,每頁查詢的條數;
- 公式:開始的索引 = (當前的頁碼 - 1) * 每頁顯示的條數
-- 每頁顯示3條記錄
SELECT * FROM student LIMIT 0,3; -- 第1頁
SELECT * FROM student LIMIT 3,3; -- 第2頁
SELECT * FROM student LIMIT 6,3; -- 第3頁
- limit 是一個MySQL"方言" 也就是說這個語句只能在MySQL裏面用
約束
-
概念: 對錶中的數據進行限定,保證數據的正確性、有效性和完整性。
-
分類:
- 主鍵約束:primary key
- 非空約束:not null
- 唯一約束:unique
- 外鍵約束:foreign key
-
非空約束:not null,值不能爲null
- 創建表時添加約束
CREATE TABLE stu(
id INT,
NAME VARCHAR(20) NOT NULL -- name爲非空
);
- 創建表完後,添加非空約束
ALTER TABLE stu MODIFY NAME VARCHAR(20) NOT NULL;
- 刪除name的非空約束
ALTER TABLE stu MODIFY NAME VARCHAR(20);
- 唯一約束:unique,值不能重複
- 創建表時,添加唯一約束
CREATE TABLE stu(
id INT,
phone_number VARCHAR(20) UNIQUE -- 添加了唯一約束
);
- 注意mysql中,唯一約束限定的列的值可以有多個null
刪除唯一約束
ALTER TABLE stu DROP INDEX phone_number;
- 在創建表後,添加唯一約束
ALTER TABLE stu MODIFY phone_number VARCHAR(20) UNIQUE;
-
主鍵約束:primary key。
-
注意:
- 含義:非空且唯一
- 一張表只能有一個字段爲主鍵
- 主鍵就是表中記錄的唯一標識
-
在創建表時,添加主鍵約束
create table stu( id int primary key,-- 給id添加主鍵約束 name varchar(20) );
-
刪除主鍵
-- 錯誤 alter table stu modify id int ; ALTER TABLE stu DROP PRIMARY KEY;
-
創建完表後,添加主鍵
ALTER TABLE stu MODIFY id INT PRIMARY KEY;
-
自動增長:
-
概念:如果某一列是數值類型的,使用 auto_increment 可以來完成值得自動增長
-
在創建表時,添加主鍵約束,並且完成主鍵自增長
create table stu( id int primary key auto_increment,-- 給id添加主鍵約束 name varchar(20) );
-
刪除自動增長
ALTER TABLE stu MODIFY id INT;
-
添加自動增長
ALTER TABLE stu MODIFY id INT AUTO_INCREMENT;
-
-
-
外鍵約束:foreign key,讓表於表產生關係,從而保證數據的正確性。
-
在創建表時,可以添加外鍵
- 語法:
create table 表名(
…
外鍵列
constraint 外鍵名稱 foreign key (外鍵列名稱) references 主表名稱(主表列名稱)
);
- 語法:
-
刪除外鍵
ALTER TABLE 表名 DROP FOREIGN KEY 外鍵名稱; -
創建表之後,添加外鍵
ALTER TABLE 表名 ADD CONSTRAINT 外鍵名稱 FOREIGN KEY (外鍵字段名稱) REFERENCES 主表名稱(主表列名稱); -
級聯操作
- 添加級聯操作
語法:ALTER TABLE 表名 ADD CONSTRAINT 外鍵名稱
FOREIGN KEY (外鍵字段名稱) REFERENCES 主表名稱(主表列名稱) ON UPDATE CASCADE ON DELETE CASCADE ; - 分類:
- 級聯更新:ON UPDATE CASCADE
- 級聯刪除:ON DELETE CASCADE
- 添加級聯操作
-
數據庫的設計
- 多表之間的關係
-
分類:
- 一對一(瞭解):
- 如:人和身份證
- 分析:一個人只有一個身份證,一個身份證只能對應一個人
- 一對多(多對一):
- 如:部門和員工
- 分析:一個部門有多個員工,一個員工只能對應一個部門
- 多對多:
- 如:學生和課程
- 分析:一個學生可以選擇很多門課程,一個課程也可以被很多學生選擇
- 一對一(瞭解):
-
實現關係:
- 一對多(多對一):
- 如:部門和員工
- 實現方式:在多的一方建立外鍵,指向一的一方的主鍵。
- 多對多:
- 如:學生和課程
- 實現方式:多對多關係實現需要藉助第三張中間表。中間表至少包含兩個字段,這兩個字段作爲第三張表的外鍵,分別指向兩張表的主鍵
- 一對一(瞭解):
- 如:人和身份證
- 實現方式:一對一關係實現,可以在任意一方添加唯一外鍵指向另一方的主鍵。
- 一對多(多對一):
-
案例
-
-- 創建旅遊線路分類表 tab_category
-- cid 旅遊線路分類主鍵,自動增長
-- cname 旅遊線路分類名稱非空,唯一,字符串 100
CREATE TABLE tab_category (
cid INT PRIMARY KEY AUTO_INCREMENT,
cname VARCHAR(100) NOT NULL UNIQUE
);
-- 創建旅遊線路表 tab_route
/*
rid 旅遊線路主鍵,自動增長
rname 旅遊線路名稱非空,唯一,字符串 100
price 價格
rdate 上架時間,日期類型
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)
);
/*創建用戶表 tab_user
uid 用戶主鍵,自增長
username 用戶名長度 100,唯一,非空
password 密碼長度 30,非空
name 真實姓名長度 100
birthday 生日
sex 性別,定長字符串 1
telephone 手機號,字符串 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)
);
/*
創建收藏表 tab_favorite
rid 旅遊線路 id,外鍵
date 收藏時間
uid 用戶 id,外鍵
rid 和 uid 不能重複,設置複合主鍵,同一個用戶不能收藏同一個線路兩次
*/
CREATE TABLE tab_favorite (
rid INT, -- 線路id
DATE DATETIME,
uid INT, -- 用戶id
-- 創建複合主鍵
PRIMARY KEY(rid,uid), -- 聯合主鍵
FOREIGN KEY (rid) REFERENCES tab_route(rid),
FOREIGN KEY(uid) REFERENCES tab_user(uid)
);
- 數據庫設計的範式
-
概念:設計數據庫時,需要遵循的一些規範。要遵循後邊的範式要求,必須先遵循前邊的所有範式要求
設計關係數據庫時,遵從不同的規範要求,設計出合理的關係型數據庫,這些不同的規範要求被稱爲不同的範式,各種範式呈遞次規範,越高的範式數據庫冗餘越小。
目前關係數據庫有六種範式:第一範式(1NF)、第二範式(2NF)、第三範式(3NF)、巴斯-科德範式(BCNF)、第四範式(4NF)和第五範式(5NF,又稱完美範式)。 -
分類:
-
第一範式(1NF):每一列都是不可分割的原子數據項
-
第二範式(2NF):在1NF的基礎上,非碼屬性必須完全依賴於碼(在1NF基礎上消除非主屬性對主碼的部分函數依賴)
- 幾個概念:
- 函數依賴:A–>B,如果通過A屬性(屬性組)的值,可以確定唯一B屬性的值。則稱B依賴於A
例如:學號–>姓名。 (學號,課程名稱) --> 分數 - 完全函數依賴:A–>B, 如果A是一個屬性組,則B屬性值得確定需要依賴於A屬性組中所有的屬性值。
例如:(學號,課程名稱) --> 分數 - 部分函數依賴:A–>B, 如果A是一個屬性組,則B屬性值得確定只需要依賴於A屬性組中某一些值即可。
例如:(學號,課程名稱) – > 姓名 - 傳遞函數依賴:A–>B, B – >C . 如果通過A屬性(屬性組)的值,可以確定唯一B屬性的值,在通過B屬性(屬性組)的值可以確定唯一C屬性的值,則稱 C 傳遞函數依賴於A
例如:學號–>系名,系名–>系主任 - 碼:如果在一張表中,一個屬性或屬性組,被其他所有屬性所完全依賴,則稱這個屬性(屬性組)爲該表的碼
例如:該表中碼爲:(學號,課程名稱)- 主屬性:碼屬性組中的所有屬性
- 非主屬性:除過碼屬性組的屬性
- 函數依賴:A–>B,如果通過A屬性(屬性組)的值,可以確定唯一B屬性的值。則稱B依賴於A
- 幾個概念:
-
第三範式(3NF):在2NF基礎上,任何非主屬性不依賴於其它非主屬性(在2NF基礎上消除傳遞依賴)
-
-
數據庫的備份和還原
- 命令行:
- 語法:
- 備份: mysqldump -u用戶名 -p密碼 數據庫名稱 > 保存的路徑
- 還原:
- 登錄數據庫
- 創建數據庫
- 使用數據庫
- 執行文件。source 文件路徑
- 語法:
- 圖形化工具: