SQLServer中SELECT语句的执行顺序

 更新时间:2010年06月09日 19:09:52   作者:  
关于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 语句时由于不清楚各个关键字的执行顺序, 往往组织的 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语句的执行顺序了吧!哈哈!

相关文章

  • SQL中INNER JOIN的实现

    SQL中INNER JOIN的实现

    本文介绍了INNER JOIN的定义、使用场景、计算方法及与其他JOIN的比较,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-09-09
  • hive中将string数据转为bigint的操作

    hive中将string数据转为bigint的操作

    这篇文章主要介绍了hive中将string数据转为bigint的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • SqlServer表死锁的解决方法分享

    SqlServer表死锁的解决方法分享

    前些天写一个存储过程,存储过程中使用了事务,后来我把一些代码注释掉来进行调试找错,突然发现一张表被锁住了,原来是创建事务的代码忘记注释掉。本文表锁住了的解决方法。
    2011-08-08
  • 基于Microsoft SQL Server实现编写汉字转拼音函数

    基于Microsoft SQL Server实现编写汉字转拼音函数

    在搜索应用中,我们一般会提供一个搜索框,输入关健字,点击查询按钮以获取结果数据,大部分情况我们会提供模糊查询的形式以在一个或多个字段进行搜索以获取结果,本文给大家就介绍了基于Microsoft SQL Server实现编写汉字转拼音函数,需要的朋友可以参考下
    2024-03-03
  • SQLServer 循环批处理

    SQLServer 循环批处理

    GO命令后面加一个常量就可以了
    2009-08-08
  • REPLICATE 以指定的次数重复字符表达式

    REPLICATE 以指定的次数重复字符表达式

    sql server以指定的次数重复字符表达式REPLICATE函数:REPLICATE函数用于以指定的次数重复字符表达式。
    2010-06-06
  • SQL Server数据库bcp导出备份文件应用示例

    SQL Server数据库bcp导出备份文件应用示例

    本节主要介绍了SQL Server数据库bcp导出备份文件应用,需要的朋友可以参考下
    2014-08-08
  • SQL server 2019数据库安装教程详解

    SQL server 2019数据库安装教程详解

    SQL Server 是Microsoft 公司推出的关系型数据库管理系统,具有使用方便可伸缩性好与相关软件集成程度高等优点,Microsoft SQL Server 数据库引擎为关系型数据和结构化数据提供了更安全可靠的存储功能,本章教程,介绍一下SQL Server 2019的安装过程
    2024-09-09
  • 实例理解SQL中truncate和delete的区别

    实例理解SQL中truncate和delete的区别

    这篇文章主要介绍了实例理解SQL中truncate和delete的区别,truncate和delete两者易混,本文就为大家进行区分两者的异同,感兴趣的小伙伴们可以参考一下
    2016-02-02
  • SQLServer更改sa用户名的方法

    SQLServer更改sa用户名的方法

    SQLServer更改sa用户名的方法,需要的朋友可以参考下。
    2010-11-11

最新评论