标签:
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>
执行步骤:
2.APPLY
<left_table_expression> {cross|outer} apply <right_table_expression>
执行步骤:
1.把右表的表达式应用于左表的行
CROSS APPLY和OUTER APPLY都包含步骤1,但是只有OUTER APPLY才包含步骤2
Pivot(聚合函数(得到结果的列) for (根据的条件的列) in(条件列的集合))
4.OVER子句
可以随聚合函数一起使用,它也是分析排名函数的需要要求的元素
集合运算符有:union all 、union、except、intersect
Union all :返回两个输入中所有行的结果,包括相同的
Union:返回两个输入中不相同的行
Except:返回在第一个中出现的,但是不再第二个中出现的,数学上讲:求两个集合的差集
Intersect:返回两个输入中都出现过的不同行,数学上讲:求两个集合的交集
标签:
原文地址:http://www.cnblogs.com/strivelearn/p/5022704.html