join on多个条件的理解

a表

在这里插入图片描述

b表

在这里插入图片描述

查询1:

在这里插入图片描述
这是一个简单的左连接,左表的数据都会查询在结果中。

查询2:

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

查询3:

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

查询4:

在这里插入图片描述
on后面的条件筛选过后将a.id=3且b.id=3(因为条件b.id != 3)和a.id=4且a.id=b.id(因为条件a.id=b.id)的数据都去除掉了,由于左连接,左表的数据又被加上了。

查询5:

在这里插入图片描述
inner join 的时候由于的内连接,on后的条件对2账表的临时表(笛卡尔积)筛选去除了左表的a.id=3且右表的b.id=3的数据以及不满足条件a.id=b.id的数据。

查询6:

在这里插入图片描述
inner join时将左表的筛选放到on或者where后面会生效。只是执行的先后顺序有所不同,on后面的是在执行join的时候筛选,where的是对join执行之后的临时表筛选。
具体执行顺序参考:https://blog.csdn.net/weixin_44457814/article/details/106715422

总结:

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

  • 32
    点赞
  • 88
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值