码迷,mamicode.com
首页 > 其他好文 > 详细

逻辑处理的各个阶段

时间:2015-12-06 01:44:17      阅读:169      评论:0      收藏:0      [点我收藏+]

标签:

逻辑查询的各个阶段

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

Sql的每一步都会生成一个虚拟表,该虚拟表作为下一步的输入。这些虚拟表对于调用者是不可用的,只有最后一步生成的虚拟表才会返回给调用者。如果在查询中没有指定某一个子句,则会跳过相应的步骤。

第一步:Sql查询语句进入FROM子句,如果存在一个表运算符,则根据表运算符的类型(JOIN、APPLY、PIVOT、UNPIVOT)进行运算。(JOIN处理步骤1.笛卡尔积 2.ON筛选器 3.添加外部行 ;PIVOT处理步骤:1.分组,2.扩展,3.聚合)处理完,如果有其他表运算符则循环继续处理。

例句:技术分享该SQL首先进入FORM子句,遇到 JOIN关键字,(LEFT OUTER是JOIN的修饰符),那么则执行JOIN的第一步笛卡尔积,然后再进行ON筛选器。如图:

技术分享

这一步执行笛卡尔积(交叉连接),如果左表包含n行,右表包含m行,则笛卡尔积则生成(n*m行)。然后进行ON筛选。ON的逻辑值有三种:TRUE/FALSE/UNKONW。然后根据ON筛选的TRUE的插入到新生成的虚拟表中,如下图。第三步添加外部行。这时候进行Left Outer Join,由于是Left join,则把左表标记为保留表,尽管左边的表在进行ON的逻辑运算的时候,一些值没有匹配上,但是我们仍然把左表没有匹配上的数据进行

技术分享添加外部行,外部行非保留的表的属性为NULL。

第二步:

进行Where的处理。需要注意的就是Where子句还没有进行分组,所以不能使用聚合函数。使用聚合函数只有在Having的子句进行使用。也不能使用Select 列表的别名。因为Select 语句还未执行。因为使用左连接所以,如果在ON处进行我们想要的逻辑判断,那么会在ON筛选条件的外表行处把逻辑条件判断相关的也添加到虚拟表。所以如果不是使用的Inner join的话,则相关的逻辑判断在Where子句中进行判断。

第三步

进行Group by的分组。在Where条件的生效后的虚拟表进行分组。

第四步:

进行Having,这时候的Having后面的根据的聚合函数里面指定的列的就需要根据条件去判断不同列就是不同的结果。(因为如果Count(NUll)与Count(*)的结果不一样,COUNT(NULL)结果为0,COUNT(*)结果为1)而且子查询不能作为聚合函数的输入。

第五步:

进行SELECT,SELECT步骤里面进行1.计算表达式。2.进行DISTINCT子句,3.应用TOP

SQL交换两个列的值: UPDATE dbo.Customers SET customerid=city,city=customerid

TOP的应用,根据什么顺序进行排序,是根据ORDER By 或者WITH TIES,如果没有指定Order by的话,那么每次查询的返回的top就可能不确定,因为恰巧先访问了。

第六步:

进行ORDER by,这里Order by是唯一可以使用select 列的别名。Order by 返回的不是一个有效的表,是一个游标。

在SQL中,集合论最重要,而集合是没有预先定义的顺序的,它只是一种逻辑的组合,成员之间的顺序是无关紧要的,对于带有排序的作用的Order by子句的查询,可以返回一个对象,其中的行是按照特定的顺序组织在一起的。这是我们可以把这种对象成为游标

如果在最外层查询使用top,那么order by 子句有两个含义:1.为top进行逻辑排序,2.为游标进行排序定义。

如果在以下情况使用那么order by 就只是为top进行逻辑顺序,而不保证结果排序

技术分享

表运算符

1.JOIN

<left_table_expression> {cross|inner|outer} join <right_table_expression>

执行步骤:

  1. 笛卡尔积
  2. 应用ON筛选器
  3. 添加外部行

2.APPLY

<left_table_expression> {cross|outer} apply <right_table_expression>

执行步骤:

1.把右表的表达式应用于左表的行

2.添加外部行(添加未匹配的为NULL的数据)

CROSS APPLY和OUTER APPLY都包含步骤1,但是只有OUTER APPLY才包含步骤2

技术分享技术分享

3.PIVOT

Pivot(聚合函数(得到结果的列) for (根据的条件的列) in(条件列的集合))

技术分享技术分享

4.OVER子句

可以随聚合函数一起使用,它也是分析排名函数的需要要求的元素

技术分享

集合运算符

集合运算符有:union all 、union、except、intersect

Union all :返回两个输入中所有行的结果,包括相同的

Union:返回两个输入中不相同的行

Except:返回在第一个中出现的,但是不再第二个中出现的,数学上讲:求两个集合的差集

Intersect:返回两个输入中都出现过的不同行,数学上讲:求两个集合的交集

技术分享 技术分享

逻辑处理的各个阶段

标签:

原文地址:http://www.cnblogs.com/strivelearn/p/5022704.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!