SQL逻辑查询语句执行顺序
还记得上面给出的那一长串的SQL逻辑查询规则么?那么,到底哪个先执行,哪个后执行呢?现在,我先给出一个查询语句的执行顺序:
(8) SELECT (9) DISTINCT <select_list>
(6) 聚合函数(select_column) (1) FROM <left_table> (3) <join_type> JOIN <right_table> (2) ON <join_condition> (关联条件) (4) WHERE <where_condition> (过滤条件) (5) GROUP BY <group_by_list> (分组条件) (7) HAVING <having_condition> (分组过滤条件) (10) ORDER BY <order_by_condition> (排序条件) (11) LIMIT <limit_number>
上面在每条语句的前面都标明了执行顺序号,不要问我怎么知道这个顺序的。我也是读各种“武林秘籍”才得知的,如果你有功夫,去阅读一下MySQL的源码,也会得出这个结果的。
理解sql语句的执行顺序对优化sql非常重要,那么sql语句的执行顺序是怎样的呢,以一条简单的的语句做分析:
这一条语句包含我们经常用到的一些关键字,select,from,where,group by,order by,它的执行顺序如下:
先执行from关键字后面的语句,明确数据的来源,它是从哪张表取来的。
接着执行where关键字后面的语句,对数据进行筛选。
再接着执行group by后面的语句,对数据进行分组分类。
然后执行select后面的语句,也就是对处理好的数据,具体要取哪一部分。
最后执行order by后面的语句,对最终的结果进行排序。
关于这个顺序,我们可以用别名来做一个判断:
左图给emp_sex取了个别名sex,然后order by后面使用了这个别名,能正常的查到数据,说明order by的执行是在select之后。再看右边的这个图,笔者接着在group by后面也使用了sex别名,点击查询后提示错误:列名‘sex’无效。说明group by的执行是在select之前。
至此我们有了初步的结论group by > select > order by。
接下来笔者也给表取了个别名,然后在where和group 后面引用这个别名。
sql正常执行,说明where和group by语句均在from语句之后执行。也就是,from > where 和 from > group by
最后只剩下where和group by的比较了,这个无法用表别名来判断,笔者目前想到的是‘常识’。这个常识就是:分组之前的过滤用where,分组之后的过滤用having。可见,where的执行是在group by之前的,即 where > group by。
根据数学知识,由
group by > select > order by
from > where
from > group by
where > group by
可得 from > where > group by > select > order by。这就是一条基本sql的执行顺序。