SQL 連線語法演進:新舊方法之間的持續爭論

BigGo Editorial Team
SQL 連線語法演進:新舊方法之間的持續爭論

SQL 社群持續討論不同連線語法方法的優劣,爭論主要集中在可讀性、效能和歷史背景等方面。這場持續的討論突顯了 SQL 從早期到現代實踐的演變過程,揭示了開發者在處理資料庫查詢時採用的不同方法。

兩種主要方法

SQL 連線有兩種主要的寫法:

  1. 傳統語法(SQL-89):
SELECT columns
FROM table1, table2
WHERE table1.key = table2.key
  1. ANSI 標準語法(SQL-92):
SELECT columns
FROM table1 INNER JOIN table2
ON table1.key = table2.key

效能和查詢計劃

儘管語法不同,多位開發者透過測試確認,在現代資料庫系統中,這兩種方法通常會產生相同的查詢執行計劃。然而,一些有趣的歷史背景浮現出來:

  • 20多年前,MySQL 在主要版本之間的隱式連線中存在表優先順序問題,需要重寫查詢
  • 現代查詢規劃器已經足夠智慧,能夠類似地最佳化這兩種形式
  • 實際效能可能因具體的資料庫引擎及其查詢規劃器而異

可讀性之爭

社群在可讀性方面存在分歧:

支援傳統語法的觀點

  • 一些開發者認為逗號分隔語法更簡潔、更易讀
  • 簡單查詢時程式碼更少
  • 對於非資料庫專家的新手來說更容易理解

支援 ANSI JOIN 語法的觀點

  • 更清晰地分離關注點(FROM 用於表關係,WHERE 用於過濾)
  • 更適合複雜的多型別連線查詢
  • 更容易修改連線型別(在 INNER、LEFT、RIGHT 連線之間切換)
  • 意圖表達更明確

最佳實踐

討論中出現了幾個模式:

  1. 連線條件放置
  • 在 ON 子句中保持結構關係的連線條件
  • 使用 WHERE 子句進行過濾條件
  • 當列名完全匹配時考慮使用 JOIN...USING
  1. 表別名
  • 使用有意義的別名以提高查詢可讀性
  • 確保列引用的一致性

現代考慮因素

雖然這場爭論對某些人來說可能顯得過時,但它仍然具有相關性,原因如下:

  1. 遺留系統仍在使用舊語法
  2. 不同團隊有不同的偏好和編碼標準
  3. 查詢最佳化考慮因素在不斷發展
  4. 不同資料庫引擎可能對語法處理方式不同

普遍共識似乎傾向於在現代開發中使用 ANSI JOIN 語法,主要是因為其明確性和對不同連線型別的靈活性,但這兩種方法在當代資料庫系統中都是有效的。