sql join 与where的区别

转载自:http://blog.chinaunix.net/uid-27570589-id-3771152.html

今天在分析一个sql语句的时候 发现 left join 与where a=b(+) 产生的执行计划不一样 而且效率也是不一样的

到底怎么回事 我在网上找了篇文章分享 
(1.)select语句的执行顺序

SELECT 语句的处理顺序

下面是SELECT语句的执行顺序

1.FROM

2.ON

3.JOIN

4.WHERE

5.GROUP BY

6.WITH CUBE or WITH ROLLUP

7.HAVING

8.SELECT

9.DISTINCT

10.ORDER BY

11.TOP


也就是说, 先进行on的过滤, 而后才进行join, 这样就避免了两个大表产生全部数据的笛卡尔积的庞大数据. 

这些步骤执行时, 每个步骤都会产生一个虚拟表,该虚拟表被用作下一个步骤的输入。这些虚拟表对调用者(客户端应用程序或者外部查询)不可用。只是最后一步生成的表才会返回 给调用者。

如果没有在查询中指定某一子句,将跳过相应的步骤。
(2) 那 on 和where 哪个更高效呢

如果是inner join, 放on和放where产生的结果一样, 但没说哪个效率速度更高? 

如果有outer join (left or right), 就有区别了, 

因为on生效在先, 已经提前过滤了一部分数据, 而where生效在后.

综合一下, 感觉还是放在on里更有效率, 因为它先于where执行.

先笛卡尔积, 然后再on过滤, 如果join是inner的, 就继续往下走,

 如果join 是left join, 就把on过滤掉的左主表中的数据再添加回来;

 然后再执行where里的过滤;

on中不是最终过滤, 因为后面left join还可能添加回来, 而where才是最终过滤.


只有当使用外连接(left, right)时, on 和 where 才有这个区别,

 如果用inner join, 在哪里制定都一样, 因为on 之后就是where, 中间没有其它步骤.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值