LEFT JOIN中ON后加条件 与 主表WHERE后加条件的区别

问题:
当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;这种写法, 还是存在一定风险的, 最好还是子查询限制好查询范围再联表

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值