Chinaunix首页 | 论坛 | 博客
  • 博客访问: 97586
  • 博文数量: 39
  • 博客积分: 2510
  • 博客等级: 少校
  • 技术积分: 405
  • 用 户 组: 普通用户
  • 注册时间: 2008-09-25 09:25
文章分类

全部博文(39)

文章存档

2011年(1)

2010年(5)

2009年(4)

2008年(29)

我的朋友
最近访客

分类: 数据库开发技术

2008-10-13 04:18:23

SQL Server 2005 技术内幕读书笔记 <笔记一 T-SQL查询内幕>
 
第一章 查询处理中的各个阶段
1.1 概述
 

(8) SELECT (9) DISTINCT (11) <TOP_specification> <select_list>
(1) FROM <left table>
(3) <join type> JOIN <right table>
(2) ON <join_condiction>
(4) WHERE <where_condiction>
(5) GROUP BY <group_by_list>
(6) WITH {CUBE | ROLLUP}
(7) HAVING <having_condiction>
(10) ORDER BY <order_by_list>

   以上列出查询的一般模式,并且根据语句被逻辑处理的顺序附上步骤序号。

   每一个步骤都会产生一个虚拟表(virtual table),该虚拟表作为下一步骤的输入。这些虚拟表对客户端应用程序或者外部查询不可用。只有最后一步产生的虚拟表才会返回给客户(调用者)。

  1.FROM 对前两个表进行笛卡尔积(Cartesian product)(交叉联接)产生VT1

  2.ON  对VT1 使用ON筛选器。 = ture 的行会插入VT2

  3.OUTER JOIN:如果指定outer join,则保留表中未找到匹配的行将作为外部行插入VT2,生成VT3。如果FROM子句中包含的表大于2,则对上一个联接生成的结果表合下一个表重复执行1-->3的步骤。

  4. WHERE 对VT3 使WHERE筛选器, = ture 则插入VT4

  5. GROUP BY 按对VT4进行分组,生成VT5

  6.CUBE|ROLLUP 把超组插入VT5,生成VT6

  7.HAVING 对VT6使用HAVING筛选器。产生VT7

  8.SELECT 处理select 列表,产生VT8

  9.DISTINCT 从VT8移除重复行,产生VT9

  10.ORDER BY 将VT9中的行按order_by_list 排序,生成一个游标(VC10)

  11.TOP 从VC10中选择指定数量或比例的行,生成表VT11,返回给调用者.

1.2 详解

步骤一:执行交叉联接。如果左表有n行,右表有m行,笛卡尔乘积将产生VT1 有 n*m行。 

步骤二:应用ON筛选器。留意SQL语言中的三值逻辑:ture,false,unknown。  

       三值逻辑:主要了解unknown:unknown这个逻辑值主要出现在包含null值的逻辑表达式中,null > 1;null = null; null + x > y 等等都为unknown。查询筛选器中(ON,WHERE,HAVING)都把unknown 当做FALSE处理,这使得unknown被排除在查询结果集合之外。但在CHECK约束中 unknown被当做TRUE对待。

步骤三:添加外部行。外部行中非保留表的属性(列值)将赋予null值,生成VT3

步骤四:应用WHERE筛选器。关于ON与WHERE 哪一个筛选器被最先使用的问题:ON在添加外部行(步骤三)之前被使用,而WHERE在步骤三之后才使用。ON在保留表中移除的部分行不是最终的,它还是会加回来。WHERE则是最终的移除。这个区别只会出现在使用OUTER JOIN的时候才会出现。一般的连接会跳过步骤三。产生VT4

步骤五:分组GROUP BY 。sql server 2005支持按表达式分组。GROUP BY ALL 这一选项在2005中的支持:它将导致在where 子句中被移除的组会重新添加进VT5,从而导致如果对这个组使用聚合函数COUNT的值为0,其他MIN MAX AVG SUM将得到null值。

步骤六:应用CUBE,ROLLUP选项

步骤七: 应用HAVING筛选器--唯一一个且第一个会用到已分组的筛选器。

步骤八:处理SELECT列表。在SELECT列表中使用的别名AS不能在之前的步骤中使用。

    这里涉及的有 all-at-once operation:sql中假设所有操作是同时完成的。

步骤九:应用DISTINCT 子句

步骤十:应用ORDER BY 子句。

阅读(740) | 评论(0) | 转发(0) |
0

上一篇:UPS坏了 难得一见

下一篇:数据库系统概念

给主人留下些什么吧!~~