首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

深度解析SQL中LEFT JOIN與INNER JOIN的ON與WHERE條件差異

     編輯:MySQL 資料庫相關知識

JOIN查詢中,條件放在ON還是WHERE,對LEFT JOIN與INNER JOIN產生截然不同的結果。本文通過具體資料集與多條對比語句,徹底釐清這一核心知識點。

測試資料準備

表 a (id, type)
11
21
32
表 b (id, class)
11
22

LEFT JOIN:ON vs WHERE 關鍵差異

語句1:條件在ON中(左表條件)

SELECT a.*, b.* FROM a LEFT JOIN b ON a.id = b.id AND a.type = 1;
結果:左表全部3行保留,右表匹配行顯示,不匹配行為NULL
a.ida.typeb.idb.class
1111
2122
32NULLNULL

結論:LEFT JOIN中,左表條件放在ON不影響左表行輸出,只影響右表匹配。

語句2:條件在WHERE中(左表條件)

SELECT a.*, b.* FROM a LEFT JOIN b ON a.id = b.id WHERE a.type = 1;
結果:左表先JOIN再過濾,僅保留type=1的2行
a.ida.typeb.idb.class
1111
2122

結論:WHERE在JOIN後過濾,會過濾掉左表不符合條件的行,實際轉為內連接行為。

語句3:條件在ON中(右表條件)

SELECT a.*, b.* FROM a LEFT JOIN b ON a.id = b.id AND b.class = 1;
結果:右表條件在ON中生效,過濾右表匹配行
a.ida.typeb.idb.class
1111
21NULLNULL
32NULLNULL

結論:右表條件放在ON會限制右表參與匹配的行,左表仍全保留。

INNER JOIN:ON與WHERE等效

語句4-7四種寫法(ON帶條件、WHERE帶條件、舊式逗號連接+WHERE、條件順序調換)結果完全一致:

a.ida.typeb.idb.class
1111
2122

核心規則:INNER JOIN中,ON與WHERE條件最終效果相同,僅執行計畫可能差異(現代優化器通常能統一)。

最佳實踐建議

  1. LEFT JOIN:連接條件放ON,過濾條件放WHERE。右表過濾條件若要保留左表行,必須放ON。
  2. INNER JOIN:條件放ON或WHERE均可,建議連接條件放ON,業務過濾放WHERE,語義清晰。
  3. 避免在LEFT JOIN的ON中放左表過濾條件(除非刻意要保留左表全量)。

理解這一機制,能避免因條件位置錯誤導致的資料缺失或效能退化,是SQL進階的必修課。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved