sql select语句执行顺序详解

发布时间:2020-06-23编辑:脚本学堂
有关sql select语句执行顺序的相关知识,深入理解sql select语句的执行顺序,对提升sql数据查询效率很有帮助,一起来了解下。

sql中select语句的执行顺序
关于sql中select语句的执行顺序,在查询分析器里边执行要用10s,换用另外一种写法只用少于1s的时间,是因为sql句语执行顺序的原因。

逻辑查询处理步骤
(8)select (9)distinct
(11)<top_specification> <select_list>
(1)from <left_table>
(3) <join_type> join <right_table>
(2) on <join_condition>
(4)where <where_condition>
(5)group by <group_by_list>
(6)with {cube | rollup}
(7)having <having_condition>
(10)order by <order_by_list>
每个步骤产生一个虚拟表,该虚拟表被用作下一个步骤的输入。
只有最后一步生成的表返回给调用者。

如果没有某一子句,则跳过相应的步骤。
1,from:对from子句中的前两个表执行笛卡尔积,生成虚拟表vt1。

2,on:对vt1应用on筛选器。只有那些使<join_condition>为真的行才被插入vt2。

3,outer(join):如果指定了outer join,保留表中未找到匹配的行将作为外部行添加到vt2,生成vt3。
如果from子句包含两个以上的表,则对上一个联接生成的结果表和下一个表重复执行步骤1到步骤3,直到处理完所有的表为止。

4,对vt3应用where筛选器。只有使<where_condition>为true的行才被插入vt4。

5,group by:按group by 子句中的列列表对vt4中的行分组,生成vt5。

6,cube|rollup:把超组插入vt5,生成vt6。

7,having:对vt6应用having筛选器。只有使<having_condition>为true的组才会被插入vt7。

8,select:处理select列表,产生vt8。

9,distinct:将重复的行从vt8中移除,产生vt9。

10,order by:将vt9中的行按order by子句中的列列表排序,生成一个有表(vc10)。

11,top:从vc10的开始处选择指定数量或比例的行,生成表vt11,并返回给调用者。

sql select语句完整的执行顺序:
1、from子句组装来自不同数据源的数据;
2、where子句基于指定的条件对记录行进行筛选;
3、group by子句将数据划分为多个分组;
4、使用聚集函数进行计算;
5、使用having子句筛选分组;
6、计算所有的表达式;
7、使用order by对结果集进行排序。
8、select 集合输出。