聯結查詢是關聯式資料庫的核心特徵,根據兩個或多個表的欄位關係,從這些表中查詢資料,實現多表查詢操作。掌握各類聯結的語意差異與適用場景,是寫出正確且高效 SQL 的基礎。
FROM join_table join_type join_table [ON (join_condition)]
join_table:參與聯結的表名,可為同一表(自聯結)join_type:聯結類型join_condition:聯結條件使用比較運算子(=、>、<、<> 等)進行表間比較。
使用 = 運算子,結果包含所有欄位(含重複欄位)。
-- 舊語法
SELECT * FROM T_student s, T_class c WHERE s.classId = c.classId
-- 標準語法
SELECT * FROM T_student s INNER JOIN T_class c ON s.classId = c.classId
使用 >、<、<> 等非等值運算子。
SELECT * FROM T_student s INNER JOIN T_class c ON s.classId <> c.classId
聯結條件同等值聯結,但移除重複欄位(如只保留一個 classId)。
SELECT s.*, c.className FROM T_student s INNER JOIN T_class c ON s.classId = c.classId
返回左表所有行,右表無匹配則顯示 NULL。
SELECT * FROM T_student s LEFT JOIN T_class c ON s.classId = c.classId
口訣:左表全保留,右表看匹配。
返回右表所有行,左表無匹配則顯示 NULL。
SELECT * FROM T_student s RIGHT JOIN T_class c ON s.classId = c.classId
返回兩表所有行,無匹配處填 NULL。
SELECT * FROM T_student s FULL JOIN T_class c ON s.classId = c.classId
無 WHERE 條件時,返回兩表行數乘積(4×4=16 行)。有 WHERE 時等同內聯結。
-- 笛卡爾積
SELECT * FROM T_student s CROSS JOIN T_class c
-- 加 WHERE 等同等值聯結
SELECT * FROM T_student s CROSS JOIN T_class c WHERE s.classId = c.classId
注意:CROSS JOIN 後只能用 WHERE,不能用 ON。
-- 內聯結系列
SELECT * FROM Territories t INNER JOIN Region r ON t.RegionID = r.RegionID;
SELECT * FROM Territories t INNER JOIN Region r ON r.RegionID <> t.RegionID; -- 不等值
SELECT t.*, r.RegionDescription FROM Territories t INNER JOIN Region r ON r.RegionID = t.RegionID; -- 自然聯結
-- 外聯結系列
SELECT * FROM Region LEFT JOIN Territories ON Territories.TerritoryDescription = Region.RegionDescription;
SELECT * FROM Region RIGHT JOIN Territories ON Territories.TerritoryDescription = Region.RegionDescription;
SELECT * FROM Region FULL JOIN Territories ON Territories.TerritoryDescription = Region.RegionDescription;
-- 交叉聯結
SELECT * FROM Region CROSS JOIN Territories;
| 聯結類型 | 結果集特徵 | 典型應用場景 |
|---|---|---|
| INNER JOIN | 雙邊都有匹配的行 | 主從表關聯、維度表查詢 |
| LEFT JOIN | 左表全保留 + 右表匹配 | 主表帶明細、報表列表 |
| RIGHT JOIN | 右表全保留 + 左表匹配 | 較少用,可改寫為 LEFT JOIN |
| FULL JOIN | 雙表全保留 | 資料對帳、差異比對 |
| CROSS JOIN | 笛卡爾積 | 生成測試資料、組合分析 |
INNER JOIN ... ON),可讀性與可維護性更佳FULL JOIN 與 CROSS JOIN,結果集易失控