參考網址: 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的聯合分組使用掌握不好。