參考網址: https://zhuanlan.zhihu.com/p/91973413
此次主要介紹多表查詢中的三部分:合並查詢結果、連接查詢(交叉連接、內連接、左連接、右連接、全連接)和CASE表達式。
1、合並查詢結果
· 含義:
利用UNION關鍵字可以給出多條SELECT語句,並將結果組合成單個結果集。
· 用法:
自動刪除重復行:SELECT語句1 UNION SELECT語句2; 保留重復行(不自動排序):SELECT語句1 UNION ALL SELECT語句2;
· 注意事項
① 合並時,兩個表對應的列數和數據類型必須相同,如果列數不同,需要補足其他字符代替,如使用'或null。
② UNION ALL關鍵字語句執行時所需要的資源少,如無需刪重,建議選擇使用。
2、交叉連接
· 含義:
交叉連接(CROSS JOIN)又可稱為笛卡爾積,將左表中每一行與右表中每一行分別連接形成新記錄。實際業務中運用較少,需要大量運算成本,但它是其他連接的基礎。
3、內連接查詢
· 含義:
內連接(INNER JOIN) 使用比較運算符進行表間某(些)列數據的比較操作,並列出這些表中與連接條件相匹配的數據行,組合成新記錄。簡而言之,查找出同時存在在不同表中的關聯數據形成結果表。
· 用法:
SELECT 字段1,字段2,字段3,…… FROM 表名1 INNER JOIN 表名2 ON 關聯條件;
等同於
SELECT 字段1,字段2,字段3,…… FROM 表名1,表名2 WHERE 關聯條件;
· 注意事項
① 如果某字段在多表中都有,則以"表名.列名"限定;
② 與INNER JOIN組合使用ON子句,而不是WHERE。ON和WHERE后面的指定條件相同, WHERE子句定義條件更簡單明了,但某些時候會影響查詢性能,而INNER JOIN語法是ANSI SQL的標准規范,能夠確保不忘記連接條件。
4、左連接查詢
· 含義:
左連接(LEFT JOIN) 以左表為基准,將右表中的信息匹配進去,如果右表無對應值,則以空值顯示。
· 用法:
SELECT 字段1,字段2,字段3,…… FROM 表名1 LEFT JOIN 表名2 ON 關聯條件;
若去掉左表有而右表為空的部分,在SELECT語句末尾加上"WHERE 表2.關聯字段=NULL"
5、右連接查詢
可類比左連接查詢。
· 含義:
右連接(RIGHT JOIN) 以右表為基准,將左表中的信息匹配進去,如果左表無對應值,則以空值顯示。
· 用法:
SELECT 字段1,字段2,字段3,…… FROM 表名1 RIGHT JOIN 表名2 ON 關聯條件;
若去掉右表有而左表為空的部分,在SELECT語句末尾加上"WHERE 表2.關聯字段=NULL"
6、全連接查詢
(由於MySQL不支持,僅作了解)
· 含義:
全連接(FULL JOIN)將左表和右表合並。無論哪張表的匹配字段缺少對應值,會以空值填充。
連接關系總結:
連接查詢的應用案例:
- 查詢所有學生的學號、姓名、選課數目和總成績
2. 查詢平均成績大於85分的所有學生的學號、姓名和平均成績
3. 查詢學生的選課情況:學號,姓名,課程號,課程名稱
7、Case表達式
用於解決復雜的查詢問題,相當於進行條件判斷的函數。
· 用法:
CASE WHEN <判斷表達式> THEN <表達式>
WHEN <判斷表達式> THEN <表達式>
WHEN <判斷表達式> THEN <表達式>
…
ELSE <表達式>
END;
ELSE可以不寫,默認為空值,但就完整性而言建議寫上。
應用案例:
- 查詢出每門課程的及格人數和不及格人數。
2. 使用分段[100-85],[85-70],[70-60],[<60]來統計各科成績,分別統計各分段人數:課程ID和課程名稱
習題:
習題總結:
在習題中的第8、11、13題遇到問題。
第8題:首先沒讀懂題目,“被進球”沒理好思路。其次是沒想過查重的問題。
第11和13題:GROUP BY的聯合分組使用掌握不好。