MySQL — 數據查詢語言

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 分頁參數
Tags: