在多表join时where和on关键字的问题

先来举个关于where过滤的例子

下面是两个代码段:

select
    stu.id,
    stu.name,
    cls.teacher
from (
    select
        id,
        name,
        class_id
    from stu
    -- 这里不同
    where class_id=1
)stu
left join (
    select 
        teacher,
        id
    from cls
)cls
on stu.class_id=cls.id
select
    stu.id,
    stu.name,
    cls.teacher
from (
    select
        id,
        name,
        class_id
    from stu
)stu
left join (
    select 
        teacher,
        id
    from cls
)cls
-- 这里不同
where class_id=1
on stu.class_id=cls.id

可以明确的说两者结果没有不同,但是代码一明显优于代码二,这就是我们所说的谓词下推带来的优点:它可以先将需要的数据进行过滤出来再join,这样处理的数据量明显减少。

还有一个是在join中,on与where的用法:

同样是上面的例子

select
    stu.id,
    stu.name,
    cls.teacher
from (
    select
        id,
        name,
        class_id
    from stu
    where class_id=1
)stu
left join (
    select 
        teacher,
        id
    from cls
)cls
-- 这里不同
on stu.class_id=cls.id
where teacher='xxx'
select
    stu.id,
    stu.name,
    cls.teacher
from (
    select
        id,
        name,
        class_id
    from stu
    where class_id=1
)stu
left join (
    select 
        teacher,
        id
    from cls
)cls
-- 这里不同
where stu.class_id=cls.id 
and teacher='xxx'

同样,以上的代码也是相同的结果,也是代码一要优于代码二,因为join中先执行on进行条件连接,没有on关键词默认笛卡尔积,两表行数直接相乘,再通过where过滤出需要的数据来,这样会导致数据量倍增,效率低下,因此连接条件还是要通过on来确定。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值