參考網址: 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)將左表和右表合併。無論哪張表的匹配欄位缺少對應值,會以空值填充。

連線關係總結:

連線查詢的應用案例:

  1. 查詢所有學生的學號、姓名、選課數目和總成績

2. 查詢平均成績大於85分的所有學生的學號、姓名和平均成績

3. 查詢學生的選課情況:學號,姓名,課程號,課程名稱

7、Case表示式

用於解決複雜的查詢問題,相當於進行條件判斷的函式。

· 用法:

CASE WHEN <判斷表示式> THEN <表示式>
WHEN <判斷表示式> THEN <表示式>
WHEN <判斷表示式> THEN <表示式>

ELSE <表示式>
END;

ELSE可以不寫,預設為空值,但就完整性而言建議寫上。

應用案例:

  1. 查詢出每門課程的及格人數和不及格人數。

2. 使用分段[100-85],[85-70],[70-60],[<60]來統計各科成績,分別統計各分段人數:課程ID和課程名稱

習題:

習題總結:

在習題中的第8、11、13題遇到問題。

第8題:首先沒讀懂題目,“被進球”沒理好思路。其次是沒想過查重的問題。

第11和13題:GROUP BY的聯合分組使用掌握不好。