天天看点

left join时,在where中增加对右表的条件

对left join,然后对右表增加where条件的不同情况做具体分析

tableA

id b_id
1 1
2 2
3 3

tableB

id ramark
1 value1
2  null(不是字符串)

------------- 

不同场景的sql:

sql1:select a.*,b.remark from tableA a  left  join tableB b on a.b_id = b.id where a.id=3;

sql2:select a.*,b.remark from tableA a inner join tableB b on a.b_id = b.id where a.id=3;

sql3:select a.*,b.remark from tableA a jeft join tableB b on a.b_id = b.id where a.id=3 and b.remark ='value';

sql4:select a.*,b.remark from tableA a jeft join tableB b on a.b_id = b.id where a.id=2 and b.remark is null;

-------------

执行结果分析:

sql1:常规写法,可以查询到数据,但是字段remark为null,这里表示的是没有关联到tableB的数据;

sql2:常规写法,查询不到数据;

sql3:查询不到数据,原因,在sql1的基础上 ,where条件中有一条对右表tableB的条件b.remark ='value',再次对结果过滤,没有符合条件的数据,结果为空;这里要说明一下,有类似的帖子对这种情况做过说明,但是可能不够详细,只说了如果对left join中的右表做了where条件过滤,就等于是inner join,这是有问题的,原因请看sql4;

sql4:结合sql3的分析,left join 时关联到了tableB中id等于2的数据,需要注意这条数据的remark字段为null,不是没查到,然后再一次通过条件 b.remark is null过滤,得到了一条数据;所以,left join 时,对右表加where条件等于inner join的说法是错误的,这只是和inner join 的结果碰巧相同而已;

版权声明:本文为CSDN博主「weixin_33739541」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/weixin_33739541/article/details/91945545