当前位置: 首页 > 图文教程 > 数据库 > MSSQL > SQL Server 2008的逻辑查询处理步骤

MSSQL
SQL Server SA权限总结经典技术
ASP数据库编程SQL常用技巧
SQL SERVER数据库开发之存储过程应用
SQL Server 2000的安全配置
MSSQL经典语句
SQL 经典语句
有用的SQL语句(删除重复记录,收缩日志)
Access 数据类型与 MS SQL 数据类型的相应
SQL语句示例
SQL数据类型详解
将Sql Server对象的当前拥有者更改成目标拥有者
MSSQL内外连接(INNER JOIN)语句详解
SQL 外链接操作小结 inner join left join right join
SQL Server中网络备份一例
SQL语句导入导出大全
SQL 新增/修改 表字段列的类型等
系统存储过程,sp_executesql
sql2005开启xp_cmdshell
实例学习SQL的Select命令
删除数据库中重复数据的几个方法

MSSQL 中的 SQL Server 2008的逻辑查询处理步骤


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-08-14   浏览: 85 ::
收藏到网摘: n/a

,查询的逻辑处理过程是分阶段完成的,每个阶段都会产生一个虚拟表,该虚拟表会作为下一个阶段的输入。但是,这些过程中间阶段生成的虚拟表对于查询用户是不可用的,只有最后阶段所生成的虚拟表(即查询结果)才返回给查询用户。

在该书的SQL Server 2005版本中,将一个联接查询的逻辑处理分为了10个步骤:

(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>

而在SQL Server 2008版本中,则对逻辑阶段的描述扩展到了所有的逻辑语句,而不仅仅是联接处理,如APPLY、PIVOT等。按这种分类方式,将逻辑步骤分成了6部分,部分步骤中包含了子步骤。

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

(1)FROM (1-J) <left_table> <join_type> JOIN <right_table> ON <join_condition>

        |(1-A) <left_table> <apply_type> APPLY <right_table_expression> AS <alias>

        |(1-P) <left_table> PIVOT(<pivot_specifications>) AS <alias>

        |(1-U) <left_table> UNPIVOT(<unpivot_specifications>) AS <alias>

(2)WHERE <where_condition>

(3)GROUP BY <group_by_list> (3-CR)WITH {CUBE | ROLLUP}

(4)HAVING <having_condition>

(6)ORDER BY <order_by_list>

下图更详细地描述了各个处理步骤的流程。

 

这种步骤分类相比2005版本而言更加全面和具体。上面步骤中的3-CR是我添加上去的,我觉得这样的描述更加全面。3-CR中的WITH ROLLUP和WITH CUBE参数,在SQL Server 2008中已经被GROUP BY子句的GROUPING SETS、ROLLUP和CUBE运算符代替,不再推荐使用不符合ISO标准的WITH ROLLUP、WITH CUBE和ALL语法。但是,这并不影响逻辑处理的顺序。

下面是对逻辑处理过程中各个步骤的说明,请注意虚拟表(VTn)的生成步骤:

·    步骤1(FROM):该步骤中用于验证查询的源表,并处理表操作符。每个表操作符应用于一系列子步骤。例如,在上面用于联接的(1-J)步骤中会涉及如下的子步骤。最终这些子步骤完成后,将生成虚拟表VT1。

Ø  (1-J1):执行left_table和right_table两个表的交叉联接(笛卡儿乘积),生成虚拟表VT1-J1;

Ø  (1-J2):对笛卡儿乘积应用ON筛选器,生成虚拟表VT1-J2;

Ø  (1-J3):如果是外部联接,会在该步骤中将被ON筛选掉的外部行添加到VT1-J2中,生成VT1-J3。否则,将跳过该步骤。

·    步骤2(WHERE):对VT1应用WHERE筛选器,将符合筛选条件的行插入到VT2中。

·    步骤3(GROUP BY):按GROUP BY子句中的列列表对VT2中的行分组,生成VT3。如果语句中包含WITH CUBE或WITH ROLLUP,则将分组统计结果再次加总后插入VT3,生成VT3-RC。

·    步骤4(HAVING):对VT3应用HAVING筛选器,将符合筛选条件的行插入到VT4。

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

u  (5-1)计算表达式:该步骤计算SELECT列表中的表达式,生成VT5-1;

u  (5-2)DISTINCT:从VT5-1中移除重复行,生成VT5-2;

u  (5-3)TOP:该步骤根据ORDER BY子句中指定的排序规则,从VT5-2的开始处筛选出指定数量或比例的行。

·    步骤6(ORDER BY):该步骤对VT5-3中的行按ORDER BY子句中的列列表进行排序,生成一个游标VC6。