SQL 社群持續討論不同連線語法方法的優劣,爭論主要集中在可讀性、效能和歷史背景等方面。這場持續的討論突顯了 SQL 從早期到現代實踐的演變過程,揭示了開發者在處理資料庫查詢時採用的不同方法。
兩種主要方法
SQL 連線有兩種主要的寫法:
- 傳統語法(SQL-89):
SELECT columns
FROM table1, table2
WHERE table1.key = table2.key
- ANSI 標準語法(SQL-92):
SELECT columns
FROM table1 INNER JOIN table2
ON table1.key = table2.key
效能和查詢計劃
儘管語法不同,多位開發者透過測試確認,在現代資料庫系統中,這兩種方法通常會產生相同的查詢執行計劃。然而,一些有趣的歷史背景浮現出來:
- 20多年前,MySQL 在主要版本之間的隱式連線中存在表優先順序問題,需要重寫查詢
- 現代查詢規劃器已經足夠智慧,能夠類似地最佳化這兩種形式
- 實際效能可能因具體的資料庫引擎及其查詢規劃器而異
可讀性之爭
社群在可讀性方面存在分歧:
支援傳統語法的觀點
- 一些開發者認為逗號分隔語法更簡潔、更易讀
- 簡單查詢時程式碼更少
- 對於非資料庫專家的新手來說更容易理解
支援 ANSI JOIN 語法的觀點
- 更清晰地分離關注點(FROM 用於表關係,WHERE 用於過濾)
- 更適合複雜的多型別連線查詢
- 更容易修改連線型別(在 INNER、LEFT、RIGHT 連線之間切換)
- 意圖表達更明確
最佳實踐
討論中出現了幾個模式:
- 連線條件放置
- 在 ON 子句中保持結構關係的連線條件
- 使用 WHERE 子句進行過濾條件
- 當列名完全匹配時考慮使用 JOIN...USING
- 表別名
- 使用有意義的別名以提高查詢可讀性
- 確保列引用的一致性
現代考慮因素
雖然這場爭論對某些人來說可能顯得過時,但它仍然具有相關性,原因如下:
- 遺留系統仍在使用舊語法
- 不同團隊有不同的偏好和編碼標準
- 查詢最佳化考慮因素在不斷發展
- 不同資料庫引擎可能對語法處理方式不同
普遍共識似乎傾向於在現代開發中使用 ANSI JOIN 語法,主要是因為其明確性和對不同連線型別的靈活性,但這兩種方法在當代資料庫系統中都是有效的。