ON 與 WHERE 條件效果等價,僅影響可讀性。ON 條件決定「如何關聯」,WHERE 條件決定「最終保留哪些行」。位置不同,結果天差地別。Table A (id, type) Table B (id, class)
1, 1 1, 1
2, 1 2, 2
3, 2
SELECT a.*, b.* FROM a LEFT JOIN b ON a.id = b.id AND a.type = 1;
結果:左表 3 行全保留,a.type=2 的行右表欄位為 NULL。
a.id a.type b.id b.class
1 1 1 1
2 1 2 2
3 2 NULL NULL
SELECT a.*, b.* FROM a LEFT JOIN b ON a.id = b.id WHERE a.type = 1;
結果:先 LEFT JOIN 產生中間表(3 行),再用 WHERE 過濾 → 僅保留 a.type=1 的 2 行。
a.id a.type b.id b.class
1 1 1 1
2 1 2 2
SELECT a.*, b.* FROM a LEFT JOIN b ON a.id = b.id AND b.class = 1;
結果:左表全保留,右表僅保留 class=1 的行,其餘置 NULL。
a.id a.type b.id b.class
1 1 1 1
2 1 NULL NULL
3 2 NULL NULL
-- 以下四句結果完全相同
SELECT * FROM a INNER JOIN b ON a.id = b.id AND a.type = 1;
SELECT * FROM a INNER JOIN b ON a.id = b.id WHERE a.type = 1;
SELECT * FROM a, b WHERE a.id = b.id AND a.type = 1;
SELECT * FROM a, b WHERE a.type = 1 AND a.id = b.id;
結果均為 2 行(a.type=1 且關聯成功)。
a.id = b.id、b.status = 1 等「如何關聯」的規則。a.type = 1、a.create_time > '2023-01-01' 等「要哪些資料」的規則。ON 是關聯邏輯,WHERE 是結果過濾。外連接時,二者位置決定「保留哪一方的不匹配行」。內連接則無差異。掌握此規則,可精準控制 JOIN 結果集,避免資料遺漏或多出。