在關係型資料庫開發中,掌握集合運算(並集、交集、差集)與表連接(內連接、外連接、交叉連接)是編寫高效查詢的基石。本文系統整理 SQL 標準語法,並對比各操作的效能差異與適用場景,助你靈活應對複雜業務需求。
合併兩個結果集的行,要求列數、順序、資料型別相容。
-- 去除重複行(預設行為)
SELECT column1, column2 FROM table1
UNION
SELECT column1, column2 FROM table2;
-- 保留所有行(含重複),效能優於 UNION
SELECT column1, column2 FROM table1
UNION ALL
SELECT column1, column2 FROM table2;
核心差異:UNION 會執行排序去重,UNION ALL 直接合併,大數據量時後者快數倍。
標準 SQL 提供 INTERSECT,但常用 INNER JOIN 替代:
-- 標準寫法(部分資料庫支援)
SELECT * FROM table1 INTERSECT SELECT * FROM table2;
-- 通用等值連接寫法
SELECT a.*
FROM table1 AS a
INNER JOIN table2 AS b ON a.name = b.name;
-- 標準寫法
SELECT * FROM table1 EXCEPT SELECT * FROM table2;
-- 子查詢寫法(注意 NULL 值陷阱)
SELECT * FROM table1
WHERE name NOT IN (SELECT name FROM table2);
-- 推薦:NOT EXISTS 避免 NULL 問題且通常更快
SELECT * FROM table1 t1
WHERE NOT EXISTS (SELECT 1 FROM table2 t2 WHERE t1.name = t2.name);
-- 顯式語法
SELECT * FROM table1 CROSS JOIN table2;
-- 隱式語法(不建議)
SELECT * FROM table1, table2;
⚠️ 警告:無條件交叉連接會產生 M×N 行,極易導致資源耗盡,僅用於極小表或測試。
僅返回滿足連接條件的匹配行。
-- 等值連接(最常用)
SELECT * FROM table1 a INNER JOIN table2 b ON a.id = b.id;
-- 非等值連接
SELECT * FROM table1 a INNER JOIN table2 b ON a.score > b.threshold;
-- 自然連接(自動匹配同名列,去除重複列,慎用)
SELECT * FROM table1 NATURAL JOIN table2;
保留單側或雙側所有行,無匹配處填 NULL。
SELECT a.*, b.name AS b_name
FROM table1 a
LEFT JOIN table2 b ON a.id = b.a_id;
-- 結果:table1 全部行 + 匹配的 table2 行,無匹配則 b_name 為 NULL
SELECT a.*, b.*
FROM table1 a
RIGHT JOIN table2 b ON a.id = b.a_id;
-- 結果:table2 全部行 + 匹配的 table1 行
SELECT a.*, b.*
FROM table1 a
FULL JOIN table2 b ON a.id = b.a_id;
-- 結果:兩表所有行,雙側無匹配處均為 NULL
同上,生產環境嚴禁無 WHERE 條件使用。
UNION 的排序開銷。ON 子句欄位務必建立索引,尤其大表連接。STRAIGHT_JOIN 提示)。NOT EXISTS 通常比 NOT IN 更穩定高效。| 需求 | 推薦語法 | 備註 |
|---|---|---|
| 合併結果、允許重複 | UNION ALL | 最快 |
| 合併結果、去重 | UNION | 含排序開銷 |
| 僅保留雙方都有的數據 | INNER JOIN / INTERSECT | 等值連接最常用 |
| 保留左表所有數據 | LEFT JOIN | 報表、主從查詢首選 |
| 保留右表所有數據 | RIGHT JOIN | 可改寫為 LEFT JOIN |
| 保留雙方所有數據 | FULL JOIN | MySQL 需用 UNION 模擬 |
| 找出 A 有但 B 無的數據 | NOT EXISTS / LEFT JOIN ... IS NULL | 避免 NOT IN |
EXPLAIN 分析執行計畫,關注 type、rows、Extra 欄位。WHERE 過濾縮小結果集,再做 JOIN。ON 條件中使用函數或隱式轉型,導致索引失效。ANALYZE TABLE 更新統計資訊,讓優化器生成最優計畫。掌握這些核心操作與優化原則,能讓你在處理複雜報表、數據清洗、多表關聯業務時遊刃有餘。實戰中多對比執行計畫,才是提升 SQL 功力的最快捷徑。