联表时的联表条件可以写在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后面的结果才是正确的