MySQL — 資料查詢語言

北涯發表於2022-03-24

DQL 全稱 Data Query Language。資料查詢語言,用來查詢資料庫中表的記錄。

1、基礎查詢

語法:

select 查詢列表(欄位、常量、函式、表示式) from 表名;

欄位別名:

select 欄位1 as '欄位1別名', 欄位2 as '欄位2別名', ... from 表名;

注意:別名可用單或雙引號引起來,當別名是一個單詞時可省略引號,當別名是多個單片語合且含空格或特殊符號時不能省略,as 可省略。

2、條件查詢

語法:

select 欄位列表 from 表名 [where 條件列表];

條件分類:

  1. 條件運算子:大於(>)、大於等於(>=)、小於(<)、小於等於(<=)、等於(=)、不等於(!= 或 <>);
  2. 邏輯運算子:並且(and)、或(or)、非(not);
  3. 模糊運算子:
    1. like 佔位符:模糊匹配,_匹配單個字元,%匹配任意個字元;
    2. between ... and ...:在某個範圍之內,包含最小最大值;
    3. not between ... and ...:不在某個範圍之內,包含最小最大值;
    4. in(...):多選;
    5. is null:為空;
    6. is not null:非空。

3、分組查詢

語法:

select 欄位列表 from 表名 [where 條件列表] group by 分組欄位列表 [having 分組後條件列表];

where 與 having 區別:

  1. 執行時機不同:where 是對分組前的原始表進行過濾,不滿足 where 條件不參與分組,having 是對分組後對結果集進行過濾;
  2. 判斷條件不同: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 的任意一個。

根據子查詢結果分為:

  1. 標量子查詢(子查詢結果為單個值);
  2. 列子查詢(子查詢結果為一列);
  3. 行子查詢(子查詢結果為一行);
  4. 表子查詢(子查詢結果為多行多列)。

根據子查詢位置分為: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 分頁引數

相關文章