问题:
当left join 联表查询时,限制的条件在不同位置会有什么结果?
(之前在网上看到说什么left join on后面拼单表的条件,例如on a.id=b.id and b.id=1 这种写法会出问题,出现的结果不是预期,于是自己去试了下)
答案:
left join 本来就是前一个表的全部信息去拼接后一个表的部分信息 .所以假如前表有三行数据 ,而后表只有一行, 那自然会出现null值的情况,如图二.三的现象.
而如果在left join 拼接后最终使用where 拼上一个条件, 相当于在结果集中进行了一次筛选,id=1当然就只能查到 1行了.如图四
简单来说,看图一目了然.
初始条件
a表
b表
查询一:
SELECT * FROM taba
LEFT JOIN tabb
on taba.id_a=tabb.id_b;
查询二:
SELECT * FROM taba
LEFT JOIN tabb
on taba.id_a=tabb.id_b and tabb.id_b=1;
查询三:
SELECT * FROM taba
LEFT JOIN (SELECT * FROM tabb where tabb.id_b=1) bb
on taba.id_a=bb.id_b ;
查询四:
SELECT * FROM taba
LEFT JOIN tabb
on taba.id_a=tabb.id_b
where tabb.id_b=1;
补充:
本以为图二.三的写法结果是完全相同的,但是试了下right join ,发现了一个新问题
查询五
SELECT * FROM taba
right JOIN tabb
on taba.id_a=tabb.id_b and tabb.id_b=1;
查询六
SELECT * FROM taba
right JOIN (SELECT * FROM tabb where tabb.id_b=1) bb
on taba.id_a=bb.id_b ;
由此,对比之前的内容, 可看出, on taba.id_a=tabb.id_b and tabb.id_b=1;这种写法, 还是存在一定风险的, 最好还是子查询限制好查询范围再联表