在 SQL 中,左连接(LEFT JOIN)的关联条件通常放在 ON 子句中,而不是 WHERE 子句中,这是“放哪更好”的核心结论。下面详细解释原因和区别。
ON 和放 WHERE 的区别ON 中(推荐 ✅)SELECT a.*, b.*
FROM A a
LEFT JOIN B b
ON a.id = b.a_id
AND b.status = 1;
特点:
ON 条件进行连接✅ 这是左连接“保留左表全部数据”的正确用法
WHERE 中(容易踩坑 ❌)SELECT a.*, b.*
FROM A a
LEFT JOIN B b
ON a.id = b.a_id
WHERE b.status = 1;
问题:
WHERE 是在连接之后过滤b.status = 1 会过滤掉 b.status IS NULL 的行❌ 左表数据可能被误删
WHERE?WHERESELECT a.*, b.*
FROM A a
LEFT JOIN B b ON a.id = b.a_id
WHERE a.type = 2;
WHERE(此时你已经不想要左连接语义了)
LEFT JOIN B b ON a.id = b.a_id
WHERE b.id IS NOT NULL;
等价于 INNER JOIN
左连接条件:右表过滤放 ON,左表过滤放 WHERE
| 条件类型 | 推荐位置 |
|---|---|
| 左表过滤 | WHERE |
| 右表连接条件 | ON |
| 右表“可选”过滤 | ON |
| 右表“必须”过滤 | WHERE(或改用 INNER JOIN) |
ON:先连接再过滤,逻辑清晰WHERE:可能让优化器更难利用索引如果你有具体 SQL 或业务场景(比如“只取最新一条”“过滤但保留左表”),可以直接发出来,我可以帮你改写。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。