(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, 中间没有其它步骤.