SQL 連接查詢是多表關聯的核心。本文以具體範例資料,圖解 LEFT JOIN、RIGHT JOIN、INNER JOIN 的語義差異、結果集特徵與適用場景。
-- 表 table1
CREATE TABLE table1 (name VARCHAR(32), city VARCHAR(32)) ENGINE=MyISAM;
INSERT INTO table1 VALUES
('Person A','BJ'), ('Person B','BJ'), ('Person C','SH'), ('Person D','SZ');
-- 表 table2
CREATE TABLE table2 (name VARCHAR(32), city VARCHAR(32)) ENGINE=MyISAM;
INSERT INTO table2 VALUES
('Person W','BJ'), ('Person X','SH'), ('Person Y','SH'), ('Person Z','NJ');
關聯鍵: city(城市)
以左表為主,左表所有列均會出現。
不符合上述規則的右表資料(如 Person Z/NJ)不會出現。
以右表為主,右表所有列均會出現,邏輯與 LEFT JOIN 鏡像對稱。
**僅保留雙方都有匹配的列**,結果集中**無 NULL 欄位**。
可視為 LEFT/RIGHT JOIN 結果中**移除含 NULL 列**後的集合。若兩表僅保留內連接產出的資料,則 LEFT/RIGHT/INNER 結果一致。
語法等價:
SELECT * FROM table1 a INNER JOIN table2 b ON a.city = b.city; SELECT * FROM table1 a JOIN table2 b ON a.city = b.city; -- 省略 INNER 同義
注意: MySQL **不支援** FULL JOIN(全外連接),需用 LEFT JOIN UNION RIGHT JOIN 模擬。
| 連接類型 | 主導表 | 結果筆數 | 含 NULL 欄位 | 典型用途 |
|---|---|---|---|---|
| LEFT JOIN | 左表 | 左表筆數 + 多匹配展開 | 右側可能為 NULL | 主表完整保留,附帶關聯明細(如訂單+商品) |
| RIGHT JOIN | 右表 | 右表筆數 + 多匹配展開 | 左側可能為 NULL | 較少用,可改寫為 LEFT JOIN 交換表順序 |
| INNER JOIN | 雙向匹配 | 僅匹配成功的筆數 | 無 | 嚴格關聯查詢(如有效訂單統計) |
city)務必**建立索引**。