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 分頁引數