SQL select语句的执行顺序

最近在面试,有一个题目是让说出给定的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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值