请选择 进入手机版 | 继续访问电脑版
虚位以待    招租QQ:244594752    尺寸:960x60
加入我们,年会VIP只需139元,全站下载
查看: 93|回复: 0

sql语句的执行顺序

[复制链接]

该用户从未签到

2163

主题

2195

帖子

7359

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
7359
发表于 2018-5-17 15:29:07 | 显示全部楼层 |阅读模式

今天思考on,where,having的执行顺序,联想到了整个sql语句的执行顺序。

sql语句的执行顺序为

(1) from
(2) on
(3) join
(4) where
(5) group by, count, sum, avg
(6) having
(7) select
(8) distinct
(9) order by
(10)top

从这个顺序中我们可以看出所有的查询语句都是从from开始执行的,在执行过程中,每个步骤都会生成一个虚拟表,这个虚拟表将作为下一个执行步骤的输入表。

1. from后如果存在多张表,那么先取出前两张表,以行数较小的表为基础表,两张表执行笛卡尔积,生成结果表vtb1

2. 将on中的逻辑表达式将应用到vtb1上,以筛选出满足逻辑表达式的行,生成结果表vtb2
一般的sql编辑器都要求join和on搭配使用,因为如果没有on,将生成笛卡尔积。如果你就是想要笛卡尔积作为结果的话,那么on后的表达式可以写1=1这种恒等式,来绕过join,on必须搭配的限制

3. 如果使用的是outer join,那么就需要添加外部行,left outer jion将左表在第二步中过滤的行添加进来,反之将右表在第二步中过滤的行添加进来,生成虚拟表vtb3。
如果from后的表的数量大于2,那么将vtb3作为第一张表,继续重复执行前三步,得到最终的vtb3。

4. 将where中的逻辑表达式将应用到vtb3上,以筛选出满足逻辑表达式的行,生成结果表vtb4

5. 将group by后字段中的唯一的值组合成为一组,得到虚拟表vtb5。之后的count,sum,avg等聚合操作都是针对组的

6. 将having中的逻辑表达式将应用到vtb5上,以筛选出满足逻辑表达式的行,生成vtb6。(having筛选器是唯一应用到已分组数据的筛选器)

7. 将select的列从vtb6中筛选出来。生成vtb7

8. 依据distinct语句,将vtb7中相同的行移除,生成vtb8。如果使用了group by那么就无需使用distinct,因为group by的结果中所有的行都不相同

9. 按照order_by指定的列排序vtb8,生成vtb9。排序是很消耗资源的,除非对结果有顺序要求,否则建议不使用order by

10.根据top的列数返回给用户


在网上看到一张图片,可以直观的展示sql语句执行顺序,希望对大家有所帮助

767841001.png


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|妙想源码社区 积分提现

GMT+8, 2018-8-17 16:50 , Processed in 1.085235 second(s), 27 queries .

Powered by Discuz! X3.2 Licensed

© 2001-2020 Comsenz Inc.

快速回复 返回顶部 返回列表
 
FDGDF
客服QQ 妙想科技 244594752
【旺旺】 点击这里给我发消息
【邮箱】
244594752@qq.com
【地址】 湖南省常德市武陵区三姑巷77
【妙想科技】 【9188qhl.com】