T-SQL 查询语句的执行顺序解析

来源:asp之家 时间:2011-11-03 17:04:06 

(5)SELECT (5-2) DISTINCT(5-3)TOP(<top_specification>)(5-1) <select_list>

(1)FROM (1-J) <left_table> <join_type> JOIN <right_table> on <on_predicate>

(2)WHERE <where_predicate>

(3)GROUP BY <group_by_specification>

(4)HAVING <having_predicate>

(6)ORDER BY <order_by_list>;

  每一步都会生成一个虚拟表,该虚拟表会作为下一步的输入。这些虚拟表对于调用者是不可用的,只有最后一步生成的虚拟表才会返回给调用者。如果在查询中没有指定某一个子句,则会跳过相应的步骤。接下来就简单地描述一下这些不同的逻辑步骤。

(1)FROM FROM阶段标识出查询的来源表,处理表运算符,每个表运算符也会应用一系列子阶段。例如,在联接运算中涉及的阶段是(1-J1)笛卡尔积、(1-J2)ON筛选器和(1-J3)添加外部行。FROM阶段生成虚拟表VT1。

(1-J1)笛卡尔积 这个阶段对表运算符涉及的两个表执行笛卡尔积(交叉联接),生成虚拟表VT1-J1。

(1-J2)ON筛选器 这个阶段对VT1-J1中的行根据ON子句中出现的谓语进行筛选。只有让该谓语取值为TRUE的行,才能插入VT1-J2中。

(1-J3)添加外部行 如果指定了OUTER JOIN(相对于CROSS JOIN 或 INNER JOIN),则将保留表(preserved table)中没有找到匹配的行,作为外部行添加到VT1-J2中,生成VT1-J3。

(2)WHERE 这个阶段根据在WHERE子句中出现的谓语(<where_predicate>)对于VT1中的行进行筛选。只有让谓语计算结果为TRUE的行,才会插入VT2中。

(3)GROUP BY 按照GROUP BY子句中指定的列名列表,将VT2中的行进行分组,生成VT3。

(4)HAVING 根据HAVING子句中出现的谓语(<having_predicate>)对VT3中的分组进行筛选。只有让谓语计算结果为TRUE的组,才会插入到VT4。

(5)SELECT 处理SELECT子句中的元素,生成VT5。

(5-1)计算表达式 计算SELECT列表中的表达式,生成VT5-1。

(5-2)DISTINCT 删除VT5-1中的重复行,生成VT5-2。

(5-3)TOP 根据ORDER BYi子句定义的逻辑排序,从VT5-2中选择前面指定数量或百分比的行,生成表VT5-3。

(6)ORDER BY 根据ORDER BY子句中指定的列名列表,对VT5-3中的行进行排序,生成游标VC6。

以上就是一个完整的T-SQL语句的执行过程,希望能给大家帮助。

以上内容摘自《Microsoft SQL Server 2008技术内幕 T-SQL查询》一书。

标签:查询语句,执行顺序
0
投稿

猜你喜欢

  • 删除重复数据的算法

    2024-05-13 09:36:14
  • Python 切片为什么不会索引越界?

    2022-02-22 19:39:47
  • mysql学习笔记之数据引擎

    2024-01-25 12:38:28
  • python matlibplot绘制3D图形

    2023-05-21 18:47:36
  • 一篇文章带你了解谷歌这些大厂是怎么写 python 代码的

    2021-03-05 05:14:51
  • MySQL高级查询语法分析

    2024-01-13 14:11:09
  • Python实现监控Nginx配置文件的不同并发送邮件报警功能示例

    2023-09-22 11:07:33
  • Python 实用技巧之利用Shell通配符做字符串匹配

    2021-07-18 22:57:16
  • TypeScript新语法之infer extends示例详解

    2024-03-13 20:42:27
  • win8下python3.4安装和环境配置图文教程

    2022-10-29 03:23:29
  • python应用文件读取与登录注册功能

    2023-04-17 17:04:03
  • mysql data文件夹位置查找

    2024-01-15 08:20:38
  • 在pytorch中对非叶节点的变量计算梯度实例

    2021-08-26 10:13:53
  • 基于JS实现动态跟随特效的示例代码

    2023-06-30 11:15:16
  • 解决Tensorflow使用pip安装后没有model目录的问题

    2023-08-09 22:58:05
  • python绘制圆柱体的方法

    2022-07-31 02:00:31
  • Pycharm github配置实现过程图解

    2022-06-16 03:49:08
  • 使用FormData实现上传多个文件

    2024-05-11 09:30:20
  • Vue生命周期示例详解

    2024-04-28 09:25:46
  • FrontPage XP设计教程5——表单的设计

    2008-10-11 12:35:00
  • asp之家 网络编程 m.aspxhome.com