sql执行顺序

sql的select执行顺序(百度sql的执行顺序,做了点笔记,记录学习一下)

form--->on--->join--->where--->group by--->having--->select--->distinct--->order by--->limit

每次操作都会产生一张虚拟的表,这个虚拟表作为下一个执行步骤的输入。

form:对from子句中的前两个表计算笛卡尔积,产生虚拟表VT1

on:对VT1进行on过滤,只有符合join条件的行才会被记录到虚拟表VT2中

join:如果是outer join添加外部行;left outer join 添加过滤后的左表;right outer join 添加过滤后的右表;生成虚拟表VT3

--------------------------------------------------------------------------------------------------------------

执行完join,如果from子句中还有表,那么把第三张表和VT3一起,重复上面的步骤,得到新的VT3

--------------------------------------------------------------------------------------------------------------

where:对虚拟表VT3进行where条件过滤,只有符合<where-condition>才会被插入到新的虚拟表VT4中

group by:将VT4中唯一的值组合成为一组,得到虚拟表VT5;如果应用了group by,那么后面的所有操作只能得到VT5的列,或者是聚合函数(count,sum,avg等)。因为在最终的结果集中只为每个组包含了一行。

cube|rollup:对VT5进行cube|rollup操作,生成VT6

having:通过having筛选生成VT7,是唯一一个能在已分组数据中过滤数据的

select:将VT7中在Select出现的列筛选出来。生成VT8

distinct:移除VT8中相同的行,生成VT9(如果sql用了group by这个就显得多余了)

order by:按照<order by-condition>排序VT9,这个时候返回的是游标,不是虚拟表。正是因为返回值是游标,所以使用order by子句查询不能应用于表表达式。(排序是很需要成本的,除非是必须要排序,否则最好不要指定order by)

limit:取出指定行的记录,返回结果给用户。







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值