联表条件on和where的区别

联表时的联表条件可以写在on后面,也可以写在where后面,有什么区别?

第一种:等值连接时的联表条件
写在 on 后面:
select * from A a join B b on a.xx = b.yy

写在where后面:
select * from A a join B b where a.xx = b.yy

这两种查询出的结果一样。

第二种:左连接 或 右连接 时的联表条件, 只有一个联表条件
联表条件只能写在 on 后面,否则语法错误
select * from A a left join B b on a.xx = b.yy

第三种:左连接 或 右连接 时的联表条件, 有多个联表条件:
这种情况,按照语法要求,必须有一个条件是要写到 on后面的,另外的条件可以写到on后面,也可以写到where后面,如下:

select * from A a left join B b on a.xx = b.yy and a.qq=b.ww
或者
select * from A a left join B b on a.xx = b.yy where a.qq=b.ww

这时两种结果就不一样了
前一个sql的结果,会显示A表的所有记录,
后一个sql就不是A表所有记录了,只会显示A表中满足 a.qq = b.ww 这个条件的数据

为什么?
因为 on 后面就是联表条件,而where后面是过滤条件
在左连接 中,一定以左表作为基准,所以左表的数据一定会全部显示出来,至于联表条件连不连的到数据是不管的,连到数据了就显示数据,没连到数据就是null 值占位, 但如果将另外一个条件写到where后面,那么联表条件就只有on后的那个,where后面的那个是过滤条件, 是在连完表的基础数据上进行过滤,那么可能就不会显示A表的全部数据了。

这是在我本地随便建的2张表试验结果:
student表:
在这里插入图片描述

user表:
在这里插入图片描述

执行如下sql, 两个联表条件全部写在on 后面:
select * from student s left join user u on s.sno=u.id and s.sname=u.name
在这里插入图片描述

再将两个联表条件的一个写到where后面:
SELECT * FROM student s LEFT JOIN user u ON s.sno=u.id WHERE s.sname=u.name
这时查询结果是空的,一条数据都没了

总结一下(个人总结,可能不对,欢迎指正):
只有在使用左连接 或右连接 这种操作,并且 有多个联表条件的,才会导致结果不一样,,全部写在on后面的结果才是正确的

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值