You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL LEFT JOIN中使用AND的结果疑问及内部执行逻辑咨询

关于LEFT JOIN中ON子句带AND条件的问题解析

核心原因:ON子句和WHERE子句的作用边界不同

你写的SQL里,customers.id = 2是放在LEFT JOIN的ON子句里的,它的作用是筛选右表(salesman)中能和左表匹配的记录,而不是过滤左表(customers)本身的记录。

LEFT JOIN的核心逻辑是:强制保留左表的所有记录,然后尝试用ON子句的条件去匹配右表数据——匹配成功就带上右表字段值,匹配失败就把右表字段填成NULL,但左表的这条记录一定会留在结果里。

对应你的SQL来看:

  • 当左表客户id=2时,会去匹配salesman表中id=2的记录,匹配到就返回合并结果,没匹配到就右表字段为NULL;
  • 当左表客户id≠2时,ON子句里的customers.id = 2不成立,所以和右表完全匹配不上,右表字段全为NULL,但左表的这条记录依然会被保留,这就是结果里出现id=1、3客户的原因。

想要只保留id=2的客户该怎么做?

把customers.id = 2移到WHERE子句里即可,SQL如下:

select * 
from customers 
left join salesman on customers.id = salesman.id 
where customers.id = 2

因为WHERE子句是在JOIN操作完成后,对整个结果集做过滤,这时候就只会留下左表中id=2的记录。

LEFT JOIN的完整执行逻辑

  1. 先取出左表的所有记录;
  2. 遍历左表的每一条记录,用ON子句的条件匹配右表的记录;
  3. 匹配成功则合并左右表字段,匹配失败则右表字段填充NULL,左表记录保留;
  4. 如果有WHERE子句,对第三步得到的结果集做最终过滤。

内容的提问来源于stack exchange,提问作者stackoverflowresearchk879

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 00:22:35