SQL Server 2005 技术内幕之T-SQL查询——逻辑查询处理(上)
SQL 不同于其他编程语言的最明显特征是处理代码的顺序。在大多数编程语言中,代码按编码顺序被处理,但在SQL中,第一个被处理的是from字句,尽管select语句第一个出现,但几乎总是在最后被处理。
每个步骤都会产生一个虚拟表,该虚拟表被用作下一个步骤的输入。这些虚拟表对调用者不可用。只有最后一步生成的表才会返回给调用者。
查询的一般形式:
1 select distinct <Top_specification> <select_list>2 from <left_table>3 <join_type> join <right_table>4 on <join_condition>5 where <where_condition>6 group by <group_by_list>7 with {cube|rollup}8 having <having_condition>9 order by <order_by_list>
逻辑查询处理阶段简介:
- from:对from字句中的前两个表执行笛卡尔积,即交叉联接,生成虚拟表VT1.
- on:对VT1应用on筛选器,只有那些使<join_condition> 为真的行被插入VT2.
- outer (join):如果指定了outer join(相对于cross join或者inner join),保留表中未找到匹配的行将作为外部行添加到VT2,生成VT3,如果from子句包含两个以上的表,则对上一个联接生成的结果表和下一个表重复执行1-3步,直到处理完所有的表为止。
- where:对VT3应用where筛选器,只有使<where_condition>为true的行被插入VT4.
- Group by:按group by子句中的列列表对VT4中的行分组,生成VT5.
- Cube | Rollup:把超组插入VT5,生成VT6.
- Having:对VT6应用having筛选器,只有使<having_condition>为true的组被插入VT7.
- Select:处理select列表,产生VT8.
- Distinct:将重复的行从VT8中删除,生成VT9.
- Order by:将VT9中的行按order by子句中的列列表排序,生成一个游标VC10.
- Top:从VC10的开始处选择指定数量或比例的行,生成表VT11,并返回给调用者。
SQL中特有的特性——三值逻辑:true,false,unknown,其中unknown逻辑值通常出现在包含null值的逻辑表达式中。Null值通常表示丢失或不相关的值。当比较丢失值和另一个值(这个值可能也是null)时,逻辑结果总是unknown。PS:unknown的否定值还是unknown。
Unknown逻辑结果和null在不同的语言元素中被区别对待,例如,所有的查询筛选器 (on, where, having) 都把unknown当作false处理,使筛选器为unknown的行会被排除在结果集之外。而check约束中的unknown值被当作true对待。
在筛选器中比较两个null值得到的是unknown,它会被当作false处理,就好像其中一个null不等于另一个null。而unique约束、排序操作和分组操作认为两个null值相等。
1、 如果表中有一列定义了unique约束,将无法向表中插入该列值为null的两行。
2、 Group by 字句把所有null值分到一起。
3、 Order by 字句把所有null值排列在一起。
对于包含outer join字句的查询,有一个让人困惑的问题,到底是在on筛选器还是在where筛选器中指定逻辑表达式。二者的主要区别是on在添加外部行之前被应用,而where在添加外部行之后被应用,on筛选器对保留表中部分行的移除并不是最终的,因为添加外部行的时候可能会再被添加回来,而where对行的移除是最终的。PS:只有在使用外部链接的时候,on和where子句才会存在这种逻辑差别。
在select列表中创建的别名不能在执行select之前的任何步骤中使用。实际上,表达式别名甚至不能用于select列表中的其他表达式,即不可同时操作。因此,一般情况下,order by是第一步也是唯一一步可以使用select列表中的列别名的步骤。
如果指定了distinct,order by子句中的表达式只能访问VT9返回的虚拟表,也就是说,只能按已经选择的列排序。这也是为什么指定了distinct就不能访问未返回的表达式的原因。
Order by不返回有效的表,而是返回一个游标。原因如下:SQL是基于集合理论的,集合不会预先对它的行排序,它只是成员的逻辑集合,成员的顺序无关紧要。对表进行排序的查询可以返回一个对象,包含按特定物理顺序组织的行。这个对象就称为游标。
尽管SQL并不为表中的行呈现特定的顺序,但它却按特定顺序维护列的位置。指定select * ( 尽管因种种原因这并不是好习惯)可以确保按特定的顺序返回列。
因为order by不返回表,所有使用它的查询不能用作表表达式。表表达式包括:视图、内联表值函数、子查询、派生表和共用表达式。它的结果必须返回给期望得到物理记录集的客户端应用程序。
记住,不要为表中的行假设任何特定的顺序,即,除非确实需要有序行,否则不要指定order by子句。排序是有成本的,SQL Server需要执行有序索引扫描或使用排序运算符。
只有指定了Top选项,才能在表表达式中使用带有order by子句的查询,换句话说,同时指定了Top和order by子句的查询可以返回一个关系结果。具有讽刺意味的是,使用了非标准非关系的Top选项后,本来应该返回游标的查询却返回了一个关系结果。
转载于:https://www.cnblogs.com/Jennifer/articles/2335958.html
SQL Server 2005 技术内幕之T-SQL查询——逻辑查询处理(上)相关推荐
- mysql桦仔_Microsoft SQL Server 2005技术内幕:T-SQL查询笔记
Microsoft SQL Server 2005技术内幕:T-SQL查询笔记 目录 f f f f f f f f 第二章 物理查询处理 分析,代数化,查询优化 f f f f f. 分析--> ...
- sql server 2005 外围应用配置器错误 - 计算机 localhost 在网络上不存在,或无法远程配置该计算机
问题 sql server 2005 外围应用配置器错误 - 计算机 localhost 在网络上不存在,或无法远程配置该计算机..... 可能存在的原因 1. 检查一下 windows下的syste ...
- [sql server] sql server 2005 外围应用配置器错误 - 计算机 localhost 在网络上不存在,或无法远程配置该计算机...
问题描述:打开sql server 2005 外围应用配置器,如图所示 点击服务和连接的外围应用配置器,结果如下: 拷贝错误信息: 标题: 外围应用配置器 ---------------------- ...
- 【Sql server: T-Sql 技术内幕 系列】之索引篇
本文系 T-Sql技术内幕系列读后感. 用过数据库的程序猿都知道,索引可以极大的优化sql语句的执行时间,但是您要问我,怎么减少的,我只能说:"抱歉,我也不太清楚." 带着这个疑惑 ...
- Microsoft SQL Server 2008技术内幕:T-SQL查询——读书笔记(全)
特别注意: 本笔记不适合初学者 SQL的官方(ANSI)发音是:ess kyooell,但更多的人叫它sequel. ** 第一章:逻辑查询处理** 在sql server中负责实际工作计划执行的是查 ...
- Microsoft SQL Server 2008技术内幕:T-SQL查询---------查询优化
示例数据库: -- Sample Data for this Chapter -- Listing 4-1: Creation Script for Sample Database and Table ...
- 笔记-Microsoft SQL Server 2008技术内幕:T-SQL语言基础-08 数据修改
插入数据 T-SQL提供了几种数据插入的语句:INSERT VALUES.INSERT SELECT.INSERT EXEC.SELECT INTO及BULK INSERT. INSERT VALUE ...
- Microsoft SQL Server 2008技术内幕:T-SQL查询---------逻辑查询处理
Three-Valued Logic(三值逻辑) SQL values: TRUE, FALSE, UNKNOWN 由于查询筛选器中 (ON, WHERE, and HAVING) 将UNKNOW认定 ...
- 笔记-Microsoft SQL Server 2008技术内幕:T-SQL语言基础-02 单表查询
SELECT子句中的别名 SELECT子句是在FROM.WHERE.GROUP BY,以及HAVING子句后处理的,这意味着对于SELECT子句之前处理的那些子句,在SELECT子句中为表达式分配的别 ...
- sql server 2005技术大全_3年2.16~3.2万吨!上机数控子公司与新疆大全签订多晶硅采购长单...
编辑| 光伏头条 光头君 今(8月24日),无锡上机数控股份有限公司(以下简称:上机数控)发布公告称, 公司全资子公司弘元新材料(包头)有限公司(以下简称"弘元新材")与新疆大全新 ...
最新文章
- 文远知行核武器曝光:无人车量产都靠它
- 近世代数--子环--怎么判断是不是子环?
- 谷歌同意向法国支付近10亿美元罚款 以了结4年前的财务欺诈调查
- Unity3D之NGUI基础7:UI动态加载
- 终于有了MSDN上的Blog
- linux刷机软件,MTK平台刷机工具——SP_Flash_Tool
- 解决:启动word等office相关软件时,比较慢,会卡在一步Foxit PDF Creator COM Add-in很久
- 通信协议之IIC总线
- Java循环综合练习四之日历打印
- Iphone 游戏引擎剖析
- 修改linux系统iqn,linux iscsi initiator 安装配置
- H3C wifi 命令
- 我竟然被淘口令骗了500大洋...
- Hello OsChina
- ZT中国制造的神奇硬盘
- 微信小程序二维码识别
- NLP之依存句法分析(小白专栏学习之路)
- 洛谷 P2178 [NOI2015]品酒大会 解题报告
- 八,如何检测PC1,PC2直接通信?
- ubuntu Rhythmbox乱码
热门文章
- 获取分辨率函数是什么_什么是像素?分辨率是什么?
- c语言游戏源码_【C语言/C++】益智游戏开发:2048(思路+源码详解)
- SQL 怎么创建一个只有查询数据库用户权限呢
- 计算机专业中专自我鉴定范文,计算机专业中专生自我鉴定范文
- 在IDEA中进行开发时,Maven的插件或依赖显示红线的问题
- laravel 事件及监听
- windows + hadoop + eclipse 过程记录
- MATLAB实现频数直方图——hist的使用
- asp.net Coolite 学习
- numpy array