Heim  >  Artikel  >  Datenbank  >  SQL Server 2008的逻辑查询处理步骤

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

WBOY
WBOYOriginal
2016-06-07 17:58:22951Durchsuche

我想大家对《SQL Server 2005技术内幕T-SQL查询》一书可能都比较熟悉,博文组织翻译的,作者是SQL Server方面的MVP Kalen .

最近我则刚刚收到了微软最有价值专家项目组寄来的该书的SQL Server 2008英文版本-《Inside Microsoft SQL Server 2008:T-SQL Querying》(http://www.microsoft.com/learning/en/us/book.aspx?ID=12804&locale=en-us),大致翻了一下,发现内容变动不少,既有新增的章节,也有基于SQL Server 2005或2008新技术重新书写的SQL查询示例。

我先就逻辑查询处理步骤方面给大家介绍一下两本书之间的差异吧,因为我也在刚开始阅读,以后逐步给大家介绍。

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

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

(8) SELECT (9) DISTINCT (11)

(1) FROM

(3) JOIN

(2) ON

(4) WHERE

(5) GROUP BY

(6) WITH {CUBE | ROLLUP}

(7) HAVING

(10) ORDER BY

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

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

(1)FROM (1-J) JOIN ON

|(1-A) APPLY AS

|(1-P) PIVOT() AS

|(1-U) UNPIVOT() AS

(2)WHERE

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

(4)HAVING

(6)ORDER BY

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

这种步骤分类相比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。

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Vorheriger Artikel:创建动态MSSQL数据库表Nächster Artikel:常用SQL功能语句