欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2023-12-05 18:24:28
(5)select (5-2) distinct(5-3)top()(5-1) ...

(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查询》一书。