SQL语句内部逻辑查询的执行顺序

来源:互联网 发布:市政工程师待遇知乎 编辑:程序博客网 时间:2024/05/01 07:16

在SQL语句做逻辑查询的时候会经历一下几个步骤:

一:添加外部行

      (1)from

      (2)笛卡儿积--这个时候是两张表做交叉连接。得到一个结果集,放入一张虚拟表中。

      (3)ON筛选器。

【补充,对于INNER JOIN,查询条件放在where和ON后面效率是一样的,对于left join一般放在on条件后面先去筛选,效率可能会更高】 

二 where子句

 【补充,对于ON筛选器里面过滤的条件不是最终的结果,对于left join还会把结果集中标记的保留表加入进来,where 子句里面过滤的是最终的结果,这也就是为什么在一些有left join的数据表里面统计多少条结果集的时候推荐使用count( xx.guid) 而不是count(*),就是因为有时候count(从表.字段)的时候left join包含了左边所以行,count(*) 结果是不准确的,但是当统计主表时,使用主表.guid和count(*)差不多,如果guid是索引,速度稍微快一点点。】

三、group by 。   进行分组,null的值认为都是相等的,放入一组

四、HAVING。 对结果集进行处理,选出满足过滤条件的结果集

五、select 。 select 列表中的表达式可以返回上一步得到的虚拟表的基础列,也可以对这些基础列的操作。

    【补充,对于select列表中创建的别名不能在前面的别名中使用,因为SQL有这样一个特性,就是多个表达式同时运行(all at once),如 select c1+1 as e1, e1+1 as e2就是错误的。 】

六、计算表达式

七、Distinct 。过滤相同列

八、TOP 选出前多少行,或者百分之多少行。

【关于这里注意一个with ties的使用,对于 TOP在order by在order之前的执行顺序个人认为有一定的争议,博友可以去验证下。】

九、ORDER BY 对结果集进行排序。

【这一步返回的不是一个虚拟表,而是一个游标,所以类似于select * from (select orderid ,customerid from a order by guid desc) as c 的写法都是错的。】