left join条件放在on后面和where后面的区别

本文解析了SQL中左连接(LEFT JOIN)与WHERE子句的不同作用,阐述了on与where条件对连接结果的影响,通过具体示例说明如何避免数据丢失。

on后面的条件:

  • 对于左表来说,不管on的条件是否为真,左表都会全部返回
  • 对于右表来说,当on的条件为假时,左表数据用null返回

where后面的条件:

  • 对连接后的结果表进行过滤 

如果将右表的过滤条件放在了where中,就可能会出现左连接后部分数据丢失的情况。

举个例子

有两个表,leader和department

 

下面看这两个SQL执行结果的区别

select * from department d LEFT JOIN leader l on d.departmentID=l.departmentID and l.departmentID is not null;

 

select * from department d LEFT JOIN leader l on d.departmentID=l.departmentID where l.departmentID is not null; 

 

再看下面这两个SQL的区别

select * from leader l LEFT JOIN department d on l.departmentID=d.departmentID and l.departmentID is not null;
 

select * from leader l LEFT JOIN department d on l.departmentID=d.departmentID where l.departmentID is not null; 

 

查询条件放置在`LEFT JOIN`后面`WHERE`后面有显著的同: 1. **在`LEFT JOIN`后面**: 当你在`LEFT JOIN`语句中将条件跟随在连接字段之后时,这实际上是在确定哪些行应该从左表中保留,并基于这个条件来查找右表的相关数据。如果某个左表的记录满足连接条件,则结果集中包含该行;即使没有匹配的右表记录,也会影响左表的行被视为"LEFT",除非`ON`或`USING`关键字中有其他否定条件。 示例: ```sql SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.id AND table2.status = 'active' ``` 如果table1中有一个id但table2中没有状态为'active'的记录,那么table1的这条记录依然会在结果中存在,只是对应的table2列值会是NULL。 2. **在`WHERE`后面**: `WHERE`通常用于过滤已经完成JOIN操作后的结果集。这意味着只有当`LEFT JOIN`返回的行同时满足`WHERE`子句中的条件时,才会出现在最终结果中。`WHERE`会影响JOIN的操作本身,它只影响哪些已连接的行会被保留在最终查询结果中。 示例: ```sql SELECT * FROM (SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.id) AS subquery WHERE subquery.table2.status = 'active' ``` 这里先做了一个左连接,然后再通过`WHERE`筛选出status为'active'的记录。 总结来说,区别在于: - 左连接后跟条件可以用来决定哪些行进入结果集以及如何从右表获取数据; - 而where条件则用于进一步筛选已连接好的行,对整个结果集应用过滤规则。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值