SQLServer中SELECT语句的执行顺序

前端之家收集整理的这篇文章主要介绍了SQLServer中SELECT语句的执行顺序前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

今天在写一条语句的时候,在查询分析器里边执行
要用10s,换用另外一种写法只用少于1s的时间,同事说是因为sql句语执行顺序的原因。之前看过一点相
关的书,有一点印象,到网上找了资料,学习下。
逻辑查询处理步骤
<div class="codetitle"><a style="CURSOR: pointer" data="91563" class="copybut" id="copybut91563" onclick="doCopy('code91563')"> 代码如下:

<div class="codebody" id="code91563">
(8)SELECT (9)DISTINCT
(11)
(1)FROM
(3)  JOIN
(2)    ON
(4)WHERE
(5)GROUP BY
(6)WITH {CUBE | ROLLUP}
(7)HAVING
(10)ORDER BY

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

原文链接:https://www.f2er.com/mssql/64130.html

猜你在找的MsSQL相关文章