SQL的查询模型简析

来源:未知 责任编辑:责任编辑 发表时间:2013-11-26 22:15 点击:

逻辑查询处理的各个阶段
一个普通格式的查询
(5)SELECT DISTINCT TOP N <SELECTLIST>
(1)FROM <LEFTTB> JOIN <RIGHTTB> ON <ONPRE>
(2)WHERE <WHEREPRE>
(3)GROUP BY <SPECIFICATION>
(4)HAVING <HAVINGPRE>
(6)ORDER BY <ORDERBYLIST>
 
SQL与其他的编程语言不同,SQL第一个处理的子句是FROM子句,上面已标记出一个Select语句的执行顺序,ORDER BY是最后执行,SELECT是第五步执行。
具体看看Select的顺序执行:  www.2cto.com  
(1)FROM:
标识出查询的来源表,处理表运算符,每一个表运算符也会有一系列子阶段:笛卡尔积、on筛选器、添加外部行。from最后会生成一张虚拟表。笛卡尔积是对两张表执行交叉联接。on筛选器是根据on子句中的谓词进行筛选,取值为true时保留。添加外部行是如果Join是outer join,则将保留表中被删除的行需要重新添加回去。
(2)WHERE: 
根据where子句中出现的谓词对查询表进行筛选,谓词为true的记录会保留。
(3)GROUP BY: 
对GROUP BY子句中的列名进行分组,每一个分组最后只有一行数据。
(4)HAVING: 
根据HAVING子句的谓词对上一步返回的表进行筛选,为true的保留。
(5)SELECT: 
SELECT子句中会有子阶段:SELECT列表表达式、DISTINCT 、TOP 。
(6)ORDER BY:
根据ORDER BY子句的列表进行排序,生成游标。
 
在搞清执行顺序之后,我们对每一步的内部执行进行探索:
 
步骤1;FROM阶段
 
from阶段负责标识表或要查询的表,如果指定了表运算符,这个阶段要按从左到右顺序对这些运算符进行处理。
这里主要是cross join交叉联接,inner join内联接,outer join外联接,其中外联接还被分成left outer join 、right outer join 、full outer join。
 
其中cross join是交叉联接,是笛卡尔积,返会一个n*m的表。
inner join是在cross join 返回结果的基础上根据on筛选器中的谓词进行筛选,为true保留。
outer join外联连是在内联接的返回结果基础上,将保留表中被删除的行添加回来,添加回来的数据叫做外部行,外部行中非保留表的属性被赋值为Null。
小讨论:三值逻辑
SQL中的重要特性,在SQL里面的谓词可能取值:true、false和unknown。unknown通常出现在涉及Null值的逻辑表达式中。true的取反是false,unknown取反还是unknown。
 
在查询筛选器中(on、WHERE、HAVING)把unknown看做false。
check约束中的unknown看做true。  www.2cto.com  
在Unique约束、集合运算符(union),以及排序、分组,认为两个Null值是相等的。
 
步骤2:WHERE阶段
 
对上一步返回的虚拟表中的所有行应用where筛选器,逻辑为true的保留,因为在where阶段之前还没有进行分组操作,所以在where子句中不能使用聚合函数。对于包含outer join子句时,on筛选器和where筛选器的区别是on在添加外部行之前,where在这之后,on筛选器的结果不是最终的,有可能在添加外部行时被重新添加回来,where筛选器是最终的结果。
 
步骤3:GROUP BY阶段
 
在GROUP BY阶段,根据指定的列表将上一步返回的表进行分组。这里指定的列表称为分组集,分组是按照分组集中所有属性值的每一个唯一组合标识出一个组。表中的每一行数据都和一个组关联,且紧关联到一个组。最终为每一组生成一行数据,则后面所有的步骤(SELECT 、HAVING)只能指定在每一组上得到标量(单个)值的表达式。在这个阶段两个Null被认为是相等的。
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
用户名: 验证码:点击我更换图片
最新评论 更多>>

推荐热点

  • sql常见面试题
  • SQL SERVER 2005性能之跟踪
  • SQL编程(一)
  • LINUX上RMAN自动备份脚本
  • sql server面试题
  • 如何将多个SQL查询统计结果一次显示出来
  • 浅谈SQL Server中的事务日志(三)----在简单恢复模式下日志的角色
  • sql server 列转行
  • SQL小技巧系列 --- 行转列合并
网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
Copyright © 2008-2015 计算机技术学习交流网. 版权所有

豫ICP备11007008号-1