SQL 表連接是關係查詢核心,但「左/右/全/內/交叉」五種連接類型常令人困惑。本文以兩張示例表 (Table1, Table2) 為基礎,結合 Venn 圖、結果集截圖、實際 SQL 與解釋,建立直觀的連接類型心智模型。
Table1 (id, name) Table2 (id, score)
id name id score
1 Alice 1 90
2 Bob 2 85
3 Carol 4 95 -- Table1 無 id=4
-- 無 id=4 -- Table1 id=3 無匹配
SELECT t1.id, t1.name, t2.score
FROM Table1 t1
INNER JOIN Table2 t2 ON t1.id = t2.id;
結果:僅返回雙方均存在的匹配行 (id=1,2)。
Venn 圖:兩圓交集部分。
語義:「給我同時在兩表中存在的記錄」。
SELECT t1.id, t1.name, t2.score
FROM Table1 t1
LEFT JOIN Table2 t2 ON t1.id = t2.id;
結果:保留 Table1 所有行,無匹配處 score=NULL (id=3 保留)。
Venn 圖:左圓全體 + 交集。
語義:「給我左表所有記錄,右表有則帶上,無則 NULL」。
SELECT t1.id, t1.name, t2.score
FROM Table1 t1
RIGHT JOIN Table2 t2 ON t1.id = t2.id;
結果:保留 Table2 所有行,無匹配處 name=NULL (id=4 保留)。
Venn 圖:右圓全體 + 交集。
語義:「給我右表所有記錄,左表有則帶上,無則 NULL」。
SELECT t1.id, t1.name, t2.score
FROM Table1 t1
FULL JOIN Table2 t2 ON t1.id = t2.id;
結果:雙方所有行,無匹配處對側列為 NULL (id=3,4 均保留)。
Venn 圖:兩圓並集。
語義:「給我兩表所有記錄,能匹配則合併,不能則各自保留」。
SELECT t1.id, t1.name, t2.id, t2.score
FROM Table1 t1
CROSS JOIN Table2 t2; -- 無 ON 條件
結果:笛卡爾積 (3×3=9 行),每行 Table1 與每行 Table2 組合。
Venn 圖:無對應 (非集合論關係)。
語義:「給我所有可能組合」。
注意:極易產生巨大結果集,生產環境極少直接使用,常用於生成測試數據、坐標網格、全排列場景。
| 連接類型 | 保留左表 | 保留右表 | 匹配條件 | 典型場景 |
|---|---|---|---|---|
| INNER JOIN | ❌ | ❌ | ✅ | 主從關聯、明細查詢 |
| LEFT JOIN | ✅ | ❌ | ✅ | 主表帶明細、報表主行 |
| RIGHT JOIN | ❌ | ✅ | ✅ | 同 LEFT,習慣交換表順序 |
| FULL JOIN | ✅ | ✅ | ✅ | 數據對賬、合併異構源 |
| CROSS JOIN | ✅ (笛卡爾) | ✅ (笛卡爾) | ❌ | 測試數據、矩陣生成 |
OPTION (FORCE ORDER) 固定 (謹慎)。ON t1.date BETWEEN t2.start AND t2.end、ON t1.val > t2.val 等,利用索引需注意 SARGable。EXISTS / NOT EXISTS、IN / NOT IN (注意 NULL 陷阱) 替代連接後 DISTINCT,性能更優。在 SSMS 中建立上述兩表,逐條執行五條 SQL,對比結果集行數、NULL 分佈、執行計劃 (估計行數 vs 實際行數)。反覆練習,將 Venn 圖、SQL、結果集三位一體內化為直覺。