一,分組查詢
使用ORDER BY子句將表中的數據分成若干組(還是按行顯示)
語法:
SELECT 字段名[,聚集函數] FROM 表名 [WHERE子句] GROUP BY 要分組的字段名 [ORDER BY子句]
需要注意的是:在GROUP BY子句后出現的字段名必須在SELECT后的查詢的字段中
1.分組查詢中篩選條件分為兩種:
類別 | 篩選數據源 | 在語句中的位置 | 使用的關鍵字 |
---|---|---|---|
分組前篩選 | 原始數據表 | GROUP BY子句前 | WHERE |
分組后篩選 | 分組后的結果集 | GROUP BY子句后 | HAVING |
注意:
(1)能用分組前篩選(WHERE子句)完成查詢優先使用分組前篩選
(2)如果聚集函數做篩選條件,則條件一定是放在HAVING子句中
2.GROUP BY子句中同時按多個字段分組
此時,GROUP BY子句后的多個字段的各個值都相同的會合並成為一行記錄,就算兩行記錄前n-1個字段的值相同,而第n個字段的值不同也不會合並成一行而是兩個不同的行。
3.添加排序
直接在GROUP BY子句后添加排序子句ORDER BY
二,連接查詢
連接查詢又稱為多表查詢。
語法:
SELECT 查詢字段 FROM 表a [別名] [連接類型關鍵字] JOIN 表b [別名] ON 連接條件
[WHERE 篩選條件] [GROUP BY子句] [HAVING 篩選條件] [ORDER BY 排序字段]
1.按功能分類:
內連接:包括 等值連接、非等值連接、自連接
外連接:包括 左外連接、右外連接、全外連接
交叉連接:實際上就是多個表的笛卡兒積
等值連接:
在連接條件中使用符號 =
非等值連接:
在連接條件中使用除 = 外其他符號,如>,<,between...and...等
自連接:inner
表自身的連接查詢,一半這種情況下,很可能對表起兩次不同的別名
需要注意的是:為表起別名后,要對查詢字段進行表限定,則要使用別名去限定二不能再使用原表名了,這個和MySQL中解析SQL語句的順序有關。
左外連接:left [outer]
以左邊的表作為主表
右外連接:right [outer]
以右邊的表作為主表
全外連接full [outer]
其實在MySQL中不支持圈外連接。
交叉連接:cross
左右表的笛卡兒積
2.按SQL標准分
在SQL92標准中:僅僅支持內連接
在SQL99標准中:支持內連接+外連接(左外,右外)+交叉連接
3.總結
以上總共有七種連接查詢,我們用一張圖來形象區分: