-- SQL 1:顯式 LEFT JOIN
SELECT T3.ID, T3.NAME
FROM ZY_UNIT_WARD T1
LEFT JOIN XT_UNIT T2 ON T1.UNITID = T2.ID
LEFT JOIN zy_ward T3 ON T2.ID = T3.UNITID
WHERE T2.ID = 8;
-- SQL 2:舊式逗號連接(隱式內連接)
SELECT T1.ID, T1.NAME
FROM zy_ward T1, XT_UNIT T2, ZY_UNIT_WARD T3
WHERE T1.ID = T3.WARDID AND T2.ID = T3.UNITID;
SQL 1 效率顯著高於 SQL 2。
| 維度 | SQL 1 (LEFT JOIN) | SQL 2 (逗號連接) |
|---|---|---|
| 執行計劃 | 優化器識別連接順序,可用 Hash Join / Merge Join | 易退化為笛卡爾積後過濾(Nested Loop),複雜度 O(N²) |
| 語義清晰度 | 連接條件與過濾條件分離 | 混在 WHERE 中,難以優化 |
| 外連接支援 | 原生 LEFT/RIGHT/FULL | 舊語法 (*=) 已棄用,不支援標準外連接 |
| 可維護性 | 高 | 低 |
FROM A, B, C WHERE ... 理論上先做 A × B × C 笛卡爾積,再按 WHERE 過濾。雖然現代優化器會嘗試重排,但複雜查詢時極易失誤,導致全表掃描、臨時表、性能雪崩。
INNER JOIN、LEFT JOIN 等)。ON,過濾條件寫在 WHERE。SELECT *,只選需要的列。T2.ID、T3.UNITID 等)。SQL 1 採用標準顯式連接,優化器能生成高效計劃;SQL 2 使用過時的隱式連接,易產生笛卡爾積災難。**寫 SQL 時請堅持顯式 JOIN**,這是性能與可維護性的基石。