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的完整执行逻辑
- 先取出左表的所有记录;
- 遍历左表的每一条记录,用ON子句的条件匹配右表的记录;
- 匹配成功则合并左右表字段,匹配失败则右表字段填充NULL,左表记录保留;
- 如果有WHERE子句,对第三步得到的结果集做最终过滤。
内容的提问来源于stack exchange,提问作者stackoverflowresearchk879
相关产品推荐
相关产品推荐

