对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 的结果碰巧相同而已;