温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

左连接条件放哪更好

发布时间:2026-11-02 17:59:56 来源:亿速云 阅读:101 作者:小樊 栏目:数据库

在 SQL 中,左连接(LEFT JOIN)的关联条件通常放在 ON 子句中,而不是 WHERE 子句中,这是“放哪更好”的核心结论。下面详细解释原因和区别。


一、左连接条件放 ON 和放 WHERE 的区别

1️⃣ 放在 ON 中(推荐 ✅)

SELECT a.*, b.*
FROM A a
LEFT JOIN B b
  ON a.id = b.a_id
 AND b.status = 1;

特点:

  • 先按 ON 条件进行连接
  • 即使 B 表没有匹配,A 表记录依然保留(B 字段为 NULL)
  • 左表数据不会丢失

✅ 这是左连接“保留左表全部数据”的正确用法


2️⃣ 放在 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?

✅ 对**左表(主表)**的过滤 → 放 WHERE

SELECT 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 或业务场景(比如“只取最新一条”“过滤但保留左表”),可以直接发出来,我可以帮你改写。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手