T--SQL查询内幕

 代码清单1-1  逻辑查询处理的步骤序号

  
  
  
  
  1. (5) SELECT (5-2) DISTINCT (5-3) TOP(<top_specification>) (5-1) <select_list> 
  2. (1) FROM (1-J) <left_table> <join_type> JOIN <right_table> ON <on_predicate> 
  3.           | (1-A) <left_table> <apply_type> APPLY <right_table_expression> AS <alias> 
  4.           | (1-P) <left_table> PIVOT(<pivot_specification>) AS <alias> 
  5.           | (1-U) <left_table> UNPIVOT(<unpivot_specification>) AS <alias> 
  6. (2) WHERE <where_predicate> 
  7. (3) GROUP BY <group_by_specification> 
  8. (4) HAVING <having_predicate> 
  9. (6) ORDER BY <order_by_list>

图1-1中的流程图更为详细地描述了逻辑查询处理的各个阶段。本章将引用该图中出现的步骤序号。

SQL与其他编程语言不同的最明显特征是代码的处理顺序。在大多数编程语言中,代码是按照编写顺序来处理的;但在SQL中,第一个要处理的子句是FROM子句,尽管SELECT语句第一个出现,但几乎总是放在最后处理。

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

 

 

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

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

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

 
(点击查看大图)图1-1  逻辑查询处理流程图

(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 BY子句定义的逻辑排序,从VT5-2中选择前面指定数量或百分比的行,生成表VT5-3。

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

你可能感兴趣的:(T--SQL查询内幕,T--SQL,查询内幕)