当前位置:  数据库>sqlserver

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

    来源: 互联网  发布时间:2014-10-04

    本文导语:  (5)SELECT (5-2) DISTINCT(5-3)TOP()(5-1) (1)FROM (1-J) JOIN on (2)WHERE (3)GROUP BY (4)HAVING (6)ORDER BY ;   每一步都会生成一个虚拟表,该虚拟表会作为下一步的输入。这些虚拟表对于调用者是不可用的,只...

(5)SELECT (5-2) DISTINCT(5-3)TOP()(5-1)

(1)FROM (1-J) JOIN on

(2)WHERE

(3)GROUP BY

(4)HAVING

(6)ORDER BY ;

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

(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子句中出现的谓语()对于VT1中的行进行筛选。只有让谓语计算结果为TRUE的行,才会插入VT2中。

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

(4)HAVING 根据HAVING子句中出现的谓语()对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查询》一书。


    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • T-SQL常用的聚合函数
  • T-SQL实例 函数结果设置为列别名
  • T-SQL常用的数学函数
  • T-SQL 实现一个简单的 Split 函数
  • t-sql清空表数据的两种方式示例(truncate and delete)
  • 学习T-SQL中default值的使用
  • T-SQL学习之一 T-SQL基础
  • T-SQL常用的元数据函数
  • T-SQL实现的一个Split函数
  • T-SQL常用游标函数实例学习
  • T-SQL判断一个日期是否为今天的函数
  • T-SQL常用的时间和日期函数
  • 使用T-SQL的Split拆分字符串的方法
  • SQLServer用t-sql命令批量删除数据库中指定表(游标循环删除)
  • SQL Server中的T-SQL的基本对象
  • T-SQL常用的系统函数
  • T-SQL 实现 Split 的方法
  • T-SQL自定义函数返回前一天或后一天日期的例子
  • 如何在T-sql 中实现数组的功能
  • T-SQL中使用正则表达式函数


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3