多表查詢有兩種寫法:舊式 FROM A, B, C WHERE ... 與 ANSI SQL-92 標準 JOIN ... ON ...。雖然簡單內連接下結果相同,但JOIN 語法在可讀性、外連接支援、優化器提示、維護性上全方位優越。本文以三表關聯實戰場景深度剖析。
需求:單一結果集顯示 `UserName`, `CardName`, `ItemName`。
SELECT A.UserName, B.CardName, C.ItemName
FROM A, B, C
WHERE A.CardCode = B.CardCode
AND A.ItemCode = C.ItemCode;
SELECT A.UserName, B.CardName, C.ItemName
FROM A
INNER JOIN B ON A.CardCode = B.CardCode
INNER JOIN C ON A.ItemCode = C.ItemCode;
| 維度 | 舊式逗號語法 | 現代 JOIN 語法 | 影響 |
|---|---|---|---|
| 外連接支援 | ❌ 僅支援內連接。舊式 `*=`/`=*` (SQL Server) / `(+)` (Oracle) 已棄用/移除 | ✅ 原生支援 LEFT/RIGHT/FULL JOIN | 需求變更 (如 Item 可為 NULL) 時,舊式需重寫邏輯,JOIN 只改關鍵字 |
| 連接順序明確性 | 隱含在 WHERE 順序,優化器自行決定 | 語法結構天然表達連接順序與層級 | 複雜查詢易閱讀、除錯、加 Hint |
| 過濾條件與連接條件分離 | 混雜在 WHERE,難區分 | ON 專司連接,WHERE 專司過濾 | 減少邏輯錯誤,特別是外連接時 `ON` vs `WHERE` 語意截然不同 |
| 優化器提示 | 難以針對特定連接加 Hint | 可在各 JOIN 獨立加 Hint (如 INNER LOOP JOIN) | 精細調優空間大 |
| 標準相容性 | 非標準,各廠商方言不同 | ANSI SQL-92 標準,跨資料庫可移植 | 異構遷移成本低 |
| 可讀性/維護性 | 表多時 WHERE 極長,難對應 | 結構化、縮排清晰、表別名就近定義 | 團隊協作、Code Review 效率高 |
假設 Table C 的 ItemName 允許 NULL (非必填)。
SELECT A.UserName, B.CardName, C.ItemName
FROM A
INNER JOIN B ON A.CardCode = B.CardCode
LEFT JOIN C ON A.ItemCode = C.ItemCode; -- 關鍵一字之差
新專案、重構、團隊規範:全面採用 ANSI JOIN 語法。
舊式逗號語法僅適合:快速臨時查詢、單純內連接、不涉及 NULL 邊界、個人一次性腳本。生產程式碼中出現舊式語法,視為技術債,應納入重構計畫。