MySQL — 數據查詢語言
DQL 全稱 Data Query Language。數據查詢語言,用來查詢數據庫中表的記錄。
1、基礎查詢
語法:
select 查詢列表(字段、常量、函數、表達式) from 表名;
字段別名:
select 字段1 as '字段1別名', 字段2 as '字段2別名', ... from 表名;
注意:別名可用單或雙引號引起來,當別名是一個單詞時可省略引號,當別名是多個單詞組合且含空格或特殊符號時不能省略,as 可省略。
2、條件查詢
語法:
select 字段列表 from 表名 [where 條件列表];
條件分類:
- 條件運算符:大於(>)、大於等於(>=)、小於(<)、小於等於(<=)、等於(=)、不等於(!= 或 <>);
- 邏輯運算符:並且(and)、或(or)、非(not);
- 模糊運算符:
- like 佔位符:模糊匹配,_匹配單個字符,%匹配任意個字符;
- between … and …:在某個範圍之內,包含最小最大值;
- not between … and …:不在某個範圍之內,包含最小最大值;
- in(…):多選;
- is null:為空;
- is not null:非空。
3、分組查詢
語法:
select 字段列表 from 表名 [where 條件列表] group by 分組字段列表 [having 分組後條件列表];
where 與 having 區別:
- 執行時機不同:where 是對分組前的原始表進行過濾,不滿足 where 條件不參與分組,having 是對分組後對結果集進行過濾;
- 判斷條件不同:where 不能對聚合函數進行判斷,having 可以。
注意事項:分組之後,查詢的字段一般為聚合函數與分組字段。
4、排序查詢
語法:
select 字段列表 from 表名 [order by 字段名1 排序方式, 字段名2 排序方式, ...];
排序方式:升序:asc(默認值,可以不寫)、降序:desc。
注意事項:如果是多個字段排序,當第一個字段值相同時,才會根據第二個字段排序。
5、分頁查詢
語法:
select 字段列表 from 表名 [limit 起始索引, 查詢記錄數];
注意事項:起始索引從0開始,起始索引 = (查詢頁碼 - 1) * 每頁顯示記錄數
,若查詢第一頁,起始索引可省略,簡寫為 limit 查詢記錄數
。
6、多表查詢
項目開發中,在進行數據庫表結構設計時,會根據業務需求及業務模塊之間的關係,分析並設計表結構,由於業務之間相互關聯,所以各個表結構之間也存在着各種聯繫,基本上分為三種:一對多(多對一)、多對多、一對一。
-
一對多
案例:部門與員工的關係。
關係:一個部門對應多個員工,一個員工對應一個部門。
實現:在多的一方建立外鍵,指向一的一方的主鍵。 -
多對多
案例:學生與課程的關係。
關係:一個學生可以選修多門課程,一門課程也可以供多個學生選擇。
實現:建立第三張中間表,中間表至少包含兩個外鍵,分別關聯兩方主鍵。 -
一對一
案例:用戶與用戶詳情的關係。
關係:一對一關係,多用於單表拆分,將一張表的基礎字段放在一張表中,其他詳情字段放在另一張表中,以提升操作效率。
實現:在任意一方加入外鍵,關聯另外一方的主鍵,並且設置外鍵為唯一的。
多表查詢時需要消除無效的笛卡爾積。笛卡爾積是指在數學中,兩個集合:A集合與B集合的所有組合情況。
6.1、連接查詢
6.1.1、內連接
查詢兩表交集部分的數據。
隱式內連接:
select 字段列表 from 表1, 表2 [where 條件列表...];
顯示內連接:
select 字段列表 from 表1 [inner] join 表2 on 連接條件 ...;
6.1.2、外連接
左外連接:查詢左表(表1)所有數據,以及兩表交集部分的數據。
select 字段列表 from 表1 left [outer] join 表2 on 連接條件 ...;
右外連接:查詢右表(表2)所有數據,以及兩表交集部分的數據。
select 字段列表 from 表1 right [outer] join 表2 on 連接條件 ...;
6.1.3、自連接
當前表與自身的連接查詢,自連接必須使用別名。自連接可以是內連接,也可以是外連接。
select 字段列表 from 表1 別名1 [inner|left|right] join 表1 別名2 on 連接條件 ...;
6.1.4、聯合查詢
將多張表查詢的結果合併成一個新的結果集,同時多張表的查詢列數及數據類型需保持一致。
union all 直接將全部數據合併在一起,union 會對合併之後的數據去重。
select 字段列表 from 表1 ...
union [all]
select 字段列表 from 表2 ...;
6.2、子查詢
SQL 語句中嵌套 select 語句,稱為嵌套查詢,又稱子查詢。子查詢外部的語句可以是 insert / delete / update / select 的任意一個。
根據子查詢結果分為:
- 標量子查詢(子查詢結果為單個值);
- 列子查詢(子查詢結果為一列);
- 行子查詢(子查詢結果為一行);
- 表子查詢(子查詢結果為多行多列)。
根據子查詢位置分為:select 之後、from 之後、where 之後。
select 之後:
select (select B.字段 from 表2 B where B.字段 = A.字段) from 表1 A ...;
from 之後:
select A.* from (select * from 表名 where 條件列表 ...) A;
where 之後:
select A.* from 表1 A where A.字段 in (select B.字段 from 表2 B);
7、執行順序
5 select 字段列表
1 from 表名列表
2 where 條件列表
3 group by 分組字段列表
4 having 分組後條件列表
6 order by 排序字段列表
7 limit 分頁參數