SQL select语句的执行顺序

来源:互联网 发布:怎样在mac上qq群视频 编辑:程序博客网 时间:2024/06/05 23:59

最近在面试,有一个题目是让说出给定的sql语句的解析执行顺序,以及怎么优化. 感觉我回答的不理想,就查阅了一下.现在就总结一下我查阅的结果,以便日后温习:

(8) select    (9)distinct     (11)[top](1) from(3) [left/right outer] join(2) on(4) where(5) group by(6) with <CUBE | RollUP>(7) having(10) order by(11) limit

执行顺序:

1 执行from子句,两张表实现一个笛卡尔积,得到一个虚拟表T1;
2 执行on子句,根据on的条件,删除T1表中的数据,得到虚拟表T2;
3 如果是外连接,则将根据on条件删除的表数据添加到left/right表,得到虚拟表T3; 如果是多张表连接,则重复2&3的步骤;
4 执行where子句,根据where条件删除T3中的数据,得到虚拟表T4;
5 如果有group子句,得到虚拟表vt5;如果应用了group by,那么后面的所有步骤都只能得到的vt5的列或者是聚合函数(count/sum/avg等),原因在于最终的结果集中只为每个组包含一行;这一点得牢记;
6 应用cube或者rollup选项,为vt5生成超组,得到虚拟表T6;
7 根据having子句条件,删除数据,得到虚拟表T7;
8 执行select子句,从T7中选出要查询的列,得到虚拟表T8;
9 执行distinct子句,从T8中删除重复数据,得到T9;(与groupby子句一起用要注意,不要是同一列)
10 执行order by子句,得到一个游标,这是唯一一个可以使用select子句字段别名的子句;
11 执行分页语句,得到虚拟表T10,作为数据集返回;

0 0
原创粉丝点击