zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

SQLServer中SELECT语句的执行顺序

SQLServer执行 语句 顺序 SELECT
2023-06-13 09:14:19 时间
今天在写一条语句的时候,在查询分析器里边执行
要用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)GROUPBY<group_by_list>
(6)WITH{CUBE|ROLLUP}
(7)HAVING<having_condition>
(10)ORDERBY<order_by_list>

每个步骤产生一个虚拟表,该虚拟表被用作下一个步骤的输入。只有最后一步生成的表返回给调用者。如
果没有某一子句,则跳过相应的步骤。
1.FROM:对FROM子句中的前两个表执行笛卡尔积,生成虚拟表VT1。
2.ON:对VT1应用ON筛选器。只有那些使<join_condition>为真的行才被插入VT2。
3.OUTER(JOIN):如果指定了OUTERJOIN,保留表中未找到匹配的行将作为外部行添加到VT2,生成VT3。
如果FROM子句包含两个以上的表,则对上一个联接生成的结果表和下一个表重复执行步骤1到步骤3,直到
处理完所有的表为止。
4.对VT3应用WHERE筛选器。只有使<where_condition>为TRUE的行才被插入VT4。
5.GROUPBY:按GROUPBY子句中的列列表对VT4中的行分组,生成VT5。
6.CUBE|ROLLUP:把超组插入VT5,生成VT6。
7.HAVING:对VT6应用HAVING筛选器。只有使<having_condition>为TRUE的组才会被插入VT7。
8.SELECT:处理SELECT列表,产生VT8。
9.DISTINCT:将重复的行从VT8中移除,产生VT9。
10.ORDERBY:将VT9中的行按ORDERBY子句中的列列表排序,生成一个有表(VC10)。
11.TOP:从VC10的开始处选择指定数量或比例的行,生成表VT11,并返回给调用者。
以下是其它网友的补充:
好像自已在书写SQL语句时由于不清楚各个关键字的执行顺序,往往组织的SQL语句缺少很好的逻辑,凭感觉"拼凑"(不好意思,如果您的SQL语句也经常"拼凑",那您是不是得好好反省一下呢?,呵呵).
这样做确实是爽了自己,可苦了机器,服务器还需要在我们的杂乱无章的SQL语句中寻找它下一句需要执行的关键字在哪里.
效率嘛,由于我们的感觉神经对秒以下的变化实在不敏感,暂且就认为自已写的SQL顺序无关紧要,"反正没什么变化!",呵呵.其实服务器对每句SQL解析时间都会有详细记录的,大家可以看一下自已按习惯写的SQL和按标准顺序写的SQL解析时间差别有多大.
因此,建议大家在平时工作中SQL语句按标准顺序写,一是专业,二是实用,呵呵,不过我觉得最主要的是心里感觉舒服.
标准的SQL的解析顺序为:
(1).FROM子句,组装来自不同数据源的数据
(2).WHERE子句,基于指定的条件对记录进行筛选
(3).GROUPBY子句,将数据划分为多个分组
(4).使用聚合函数进行计算
(5).使用HAVING子句筛选分组
(6).计算所有的表达式
(7).使用ORDERBY对结果集进行排序
举例说明:在学生成绩表中(暂记为tb_Grade),把"考生姓名"内容不为空的记录按照"考生姓名"分组,并且筛选分组结果,选出"总成绩"大于600分的.
标准顺序的SQL语句为:
select考生姓名,max(总成绩)asmax总成绩
fromtb_Grade
where考生姓名isnotnull
groupby考生姓名
havingmax(总成绩)>600
orderbymax总成绩
在上面的示例中SQL语句的执行顺序如下:
(1).首先执行FROM子句,从tb_Grade表组装数据源的数据
(2).执行WHERE子句,筛选tb_Grade表中所有数据不为NULL的数据
(3).执行GROUPBY子句,把tb_Grade表按"学生姓名"列进行分组
(4).计算max()聚集函数,按"总成绩"求出总成绩中最大的一些数值
(5).执行HAVING子句,筛选课程的总成绩大于600分的.
(7).执行ORDERBY子句,把最后的结果按"Max成绩"进行排序.
好了,看了这些之后,我相信大家都知道了SQL中select语句的执行顺序了吧!哈哈!