SQL逻辑查询处理步骤(11步)未完待续…

步骤1:执行笛卡尔乘积(交叉连接)

对from 子句的前两个表执行笛卡尔乘积(交叉联接或未限定的联接),生成虚拟表VT1。既:如果左表包含n行,右表包含m行。VT1将包含n*m行。

步骤2:应用on筛选器(联接条件)

on筛选器中的逻辑表达式被应用到上一步骤返回的虚拟表VT1中的所有行。只有使<联接条件>为true的行才会包含在步骤2返回的虚拟表VT2中。

    注意:sql中逻辑表达式的可能值包括:true,false,unkown,它们被称为三值逻辑。

步骤3:添加外部行(Outer Row)

这一步只与外部联接(left,right,full) outer join有关。通过指定一种外部联接,可以把一个或者两个输入表标记为保留表。将表标记为保留表的意义是:返回该表的所有行,包括<联接条件>过滤掉的行。left outer join把左表标记为保留表,rigth outer join把右表标记为保留表,full outer join将两张表都标记为保留表。步骤3返回VT2中的行及保留表在步骤2中被过滤掉行。保留表中被步骤2过滤的行称为外部行。外部行中非保留表的列值被赋值为null。最终返回TV3。

步骤4:应用where 筛选器

对上一步返回的虚拟表中所有行应用where筛选器。只有符合<where条件>的行才会成为该步骤所返回的虚拟表VT4的一部分。

注意:1,此时数据还没有被分组,还不能使用聚会筛选器,例如 where orderdate=max(orderdate)。

        2,不能引用select列表中的别名,因为select列表此时尚未被处理。例如 select year(orderdate) as orderyear where orderyear>2000。

困惑:对于包含outer join的子句的查询,到底是在on筛选器还是在where筛选器中指定逻辑表达式。二者区别在于:on在添加外部行之前被应用,where在添加外部行之后被应用。on对行移除不是最终的,步骤3可能将on过滤的行添加回来。而where筛选器对行移除是最终。【使用内部联接时,在哪里指定表达式都无所谓。因为步骤3被跳过。

步骤5:分组group by

上一步返回的行被分配到各个组。group by子句中列列表的每个唯一的值组合成一组(即:将group by 列列表值相同【一列或多列项同】的数据分为一组)得到VT5。

列如:表C的结构和数据

     L1         L2            L3

     1            A             100

     1            B             11

     2            C             100

     3            D              22

     3            D              22

查询语句  select   L1,L2 from C group by L1,如果编译成功将得到如下结果

   L1            L2

   1              A

                   B

   2              C

   3              D

但是上面结果是无法显示的,所以编译select   L1,L2 from C group by L1不通过。如果指定了group by子句。则后面所有的步骤(having,select等)只能指定可以为分组得到标量值的表达式。

该限制是因为的结果集中只能为每一个组包含一行数据(除非该组被过滤掉了)。

所有 对于C表的查询,可以是select   L1,count(L2)  as count  from C group by L1得到结果如下:

   L1            Count

   1             2

   2             1

   3             2

group by 有一个原则,就是 select 后面的所有列中,没有使用聚合函数的列,必须出现在 group by 后面。group by主要用于对返回值进行聚合函数计算和查找相同记录。所有null值会被分到一组。

步骤6:应用cube 或rollup选项

步骤7:应用having筛选器

只有符合<having_condition>的组才会成为虚拟表VT6的一部分。having是第一个也是唯一一个应用到已分组数据的筛选器。

步骤8:处理select列表

步骤9:应用distinct子句

步骤10:应用order by子句

步骤11:应用top选项

sql server2005中加入了新的逻辑处理阶段

1、表运算符

2、over 子句

3、集合操作

posted on 2010-10-17 23:10  风的轮廓  阅读(343)  评论(0编辑  收藏  举报

导航