join on多个条件的理解

a表

join on多个条件的理解_第1张图片

b表

join on多个条件的理解_第2张图片

查询1:

join on多个条件的理解_第3张图片
这是一个简单的左连接,左表的数据都会查询在结果中。

查询2:

join on多个条件的理解_第4张图片
左连接,on后面跟了2个条件,其中第二个条件对左表进行筛选,可以看到在结果中并没有起作用。因为on的条件筛选是对2张表生成的全连接(笛卡尔积)临时表进行的筛选,这时a.id=4的数据实际上是被去除掉了,因为没有a.id=4且a.id=b.id的数据。但是由于是left join,所以在结果中没有的左表数据a.id=4又被加了上去。
由此可见left join 的时候,on后面对左表的数据加筛选条件是没有用的。

查询3:

join on多个条件的理解_第5张图片
将上一个on的条件放到where里面之后就生效了。因为对on执行过后的临时表(此时该临时表还是有a.id=4的数据的,因为左连接),进一步筛选的时候,将a.id=4的数据去掉了。

查询4:

join on多个条件的理解_第6张图片
on后面的条件筛选过后将a.id=3且b.id=3(因为条件b.id != 3)和a.id=4且a.id=b.id(因为条件a.id=b.id)的数据都去除掉了,由于左连接,左表的数据又被加上了。

查询5:

join on多个条件的理解_第7张图片
inner join 的时候由于的内连接,on后的条件对2账表的临时表(笛卡尔积)筛选去除了左表的a.id=3且右表的b.id=3的数据以及不满足条件a.id=b.id的数据。

查询6:

join on多个条件的理解_第8张图片
inner join时将左表的筛选放到on或者where后面会生效。只是执行的先后顺序有所不同,on后面的是在执行join的时候筛选,where的是对join执行之后的临时表筛选。
具体执行顺序参考:https://blog.csdn.net/weixin_44457814/article/details/106715422

总结:

在连表操作的时候,其实是先进行了2表的全连接(笛卡尔积,也就是所有能组合的情况a.rowCount*b.rowCount),然后根据on后面的条件进行筛选,最后如果是左连接或者右连接,再补全左表或者右表的数据。

你可能感兴趣的:(sql)