T-SQL 之 概述
T-SQL(Transact Structured Query Language )它是ANSI和ISO SQL 标准的Microsoft SQL Server方言或扩展,SQL SERVER专用标准结构化查询语言增强版。,它是用来让应用程式与 SQL Server 沟通的主要语言。T-SQL 提供标准 SQL 的 DDL 和 DML 功能,加上延伸的函数、系统预存程序以及程式设计结构(例如 IF 和 WHILE)让程式设计更有弹性。
SQL 不同于与其他编程语言的最明显特征是处理代码的顺序。在大数编程语言中,代码按编码顺序被处理,但是在SQL语言中,第一个被处理的子句是FROM子句,尽管SELECT语句第一个出现,但是几乎总是最后被处理。
每个步骤都会产生一个虚拟表,该虚拟表被用作下一个步骤的输入。这些虚拟表对调用者(客户端应用程序或者外部查询)不可用。只是最后一步生成的表才会返回给调用者。如果没有在查询中指定某一子句,将跳过相应的步骤。
首先,对应用于SQL server 2000和SQL Server 2005的各个逻辑步骤的简单描述:
(8) SELECT (9) DISTINCT (11) <TOP_specification> <select_list>
(1) FROM <left_table>
(3) <join_type> JOIN <right_table>
(2) ON <join_condition>
(4) WHERE <where_condition>
(5) GROUP BY <group_by_list>
(6) WITH {CUBE | ROLLUP}
(7) HAVING <having_condition>
(10) ORDER BY <order_by_list>
逻辑查询处理阶段简介
- FROM:对FROM子句中的前两个表执行笛卡尔积(Cartesian product)(交叉联接),生成虚拟表VT1。
- ON:对VT1应用ON筛选器。只有那些使<join_condition>为真的行才被插入VT2。
- OUTER(JOIN):如 果指定了OUTER JOIN(相对于CROSS JOIN 或(INNER JOIN),保留表(preserved table:左外部联接把左表标记为保留表,右外部联接把右表标记为保留表,完全外部联接把两个表都标记为保留表)中未找到匹配的行将作为外部行添加到 VT2,生成VT3。如果FROM子句包含两个以上的表,则对上一个联接生成的结果表和下一个表重复执行步骤1到步骤3,直到处理完所有的表为止。
- WHERE:对VT3应用WHERE筛选器。只有使<where_condition>为true的行才被插入VT4。
- GROUP BY:按GROUP BY子句中的列列表对VT4中的行分组,生成VT5。
- CUBE|ROLLUP:把超组(Suppergroups)插入VT5,生成VT6。
- HAVING:对VT6应用HAVING筛选器。只有使<having_condition>为true的组才会被插入VT7。
- SELECT:处理SELECT列表,产生VT8。
- DISTINCT:将重复的行从VT8中移除,产生VT9。
- ORDER BY:将VT9中的行按ORDER BY 子句中的列列表排序,生成游标(VC10)。
- TOP:从VC10的开始处选择指定数量或比例的行,生成表VT11,并返回调用者。
注:步骤10,按ORDER BY子句中的列列表排序上步返回的行,返回游标VC10。这一步是第一步也是唯一一步可以使用SELECT列表中的列别名的步骤。这一步不同于其它步骤的 是,它不返回有效的表,而是返回一个游标。SQL是基于集合理论的。集合不会预先对它的行排序,它只是成员的逻辑集合,成员的顺序无关紧要。对表进行排序 的查询可以返回一个对象,包含按特定物理顺序组织的行。ANSI把这种对象称为游标。理解这一步是正确理解SQL的基础。
因为这一步不返回表(而是返回游标),使用了ORDER BY子句的查询不能用作表表达式。表表达式包括:视图、内联表值函数、子查询、派生表和共用表达式。它的结果必须返回给期望得到物理记录的客户端应用程序。
例如,下面的派生表查询无效,并产生一个错误:
select *
from(select orderid,customerid from orders order by orderid) as d
下面的视图也会产生错误
create view my_view
as
select *
from orders
order by orderid
在SQL中,表表达式中不允许使用带有ORDER BY子句的查询,而在T—SQL中却有一个例外(应用TOP选项)。
所以要记住,不要为表中的行假设任何特定的顺序。换句话说,除非你确定要有序行,否则不要指定ORDER BY 子句。排序是需要成本的,SQL Server需要执行有序索引扫描或使用排序运行符。
二、在SQL Server 2008版本中,则对逻辑阶段的描述扩展到了所有的逻辑语句,而不仅仅是联接处理,如APPLY、PIVOT等。按这种分类方式,将逻辑步骤分成了6部分,部分步骤中包含了子步骤。
(5)SELECT (5-2)DISTINCT (5-3)<TOP_specification> (5-1)<select_list>
(1)FROM (1-J) <left_table> <join_type> JOIN <right_table> ON <join_condition>
|(1-A) <left_table> <apply_type> APPLY <right_table_expression> AS <alias>
|(1-P) <left_table> PIVOT(<pivot_specifications>) AS <alias>
|(1-U) <left_table> UNPIVOT(<unpivot_specifications>) AS <alias>
(2)WHERE <where_condition>
(3)GROUP BY <group_by_list> (3-CR)WITH {CUBE | ROLLUP}
(4)HAVING <having_condition>
(6)ORDER BY <order_by_list>
下图更详细地描述了各个处理步骤的流程:
这种步骤分类相比2005版本而言更加全面和具体。上面步骤中的3-CR是我添加上去的,我觉得这样的描述更加全面。3-CR中的WITH ROLLUP和WITH CUBE参数,在SQL Server 2008中已经被GROUP BY子句的GROUPING SETS、ROLLUP和CUBE运算符代替,不再推荐使用不符合ISO标准的WITH ROLLUP、WITH CUBE和ALL语法。但是,这并不影响逻辑处理的顺序。
下面是对逻辑处理过程中各个步骤的说明,请注意虚拟表(VTn)的生成步骤:
1. FROM:该步骤中用于验证查询的源表,并处理表操作符。每个表操作符应用于一系列子步骤。例如,在上面用于联接的(1-J)步骤中会涉及如下的子步骤。最终这些子步骤完成后,将生成虚拟表VT1。
[1] (1-J1):执行left_table和right_table两个表的交叉联接(笛卡儿乘积),生成虚拟表VT1-J1;
[2] (1-J2):对笛卡儿乘积应用ON筛选器,生成虚拟表VT1-J2;
[3] (1-J3):如果是外部联接,会在该步骤中将被ON筛选掉的外部行添加到VT1-J2中,生成VT1-J3。否则,将跳过该步骤。
2. WHERE:对VT1应用WHERE筛选器,将符合筛选条件的行插入到VT2中。
3. GROUP BY:按GROUP BY子句中的列列表对VT2中的行分组,生成VT3。如果语句中包含WITH CUBE或WITH ROLLUP,则将分组统计结果再次加总后插入VT3,生成VT3-RC。
4. HAVING:对VT3应用HAVING筛选器,将符合筛选条件的行插入到VT4。
5. SELECT:处理SELECT子句中的元素,生成VT5。
[1](5-1)计算表达式:该步骤计算SELECT列表中的表达式,生成VT5-1;
[2](5-2)DISTINCT:从VT5-1中移除重复行,生成VT5-2;
[3](5-3)TOP:该步骤根据ORDER BY子句中指定的排序规则,从VT5-2的开始处筛选出指定数量或比例的行。
6. ORDER BY:该步骤对VT5-3中的行按ORDER BY子句中的列列表进行排序,生成一个游标VC6。
T-SQL 之 概述的更多相关文章
- Oracle-05-SQL语句概述、分类&SQL*PLUS概述(初识insert,desc,list,r,del,a,c,n等命令)
一.SQL语句概述 (1)SQL全程是"结构化查询语言(Structured Query Language)". SQL是大多数主流数据库系统採用的标准查询语言. (2)SQL语句 ...
- SQL语言概述
功能概述 DDL,数据库定义语言,创建,修改,删除数据库,表,视图,索引,约束条件等 DML,数据库操纵语言,对数据库中的数据进行增,删,改,查 DCL,数据库定义语言,对数据库总数据的访问设置权限 ...
- 第一讲:SQL语言概述
SQL语言是集DDL.DML和DCL于一体的数据库语言. SQL语言之DDL:定义数据库 SQL语言之DML:操纵数据库 一.功能概述 SQL语言主要由以下9个单词引导的操作语句来构成,但每一条语句都 ...
- Spark SQL catalyst概述和SQL Parser的具体实现
之前已经对spark core做了较为深入的解读,在如今SQL大行其道的背景下,spark中的SQL不仅在离线batch处理中使用广泛,structured streamming的实现也严重依赖spa ...
- SQL server概述
sqlserver中包含的对象: 数据库.事务日志.索引.文件组.数据库关系图.视图.存储过程.用户自定义函数.用户.角色.程序集.表.报表.全文目录.用户自定义数据类型 数据库实际上是最高层对象,其 ...
- SQL基本概述
DBMS的种类: 层次数据库HDB 面向对象数据库OODB XML数据库XMLDB 键值存储系统KVS 关系数据库RDB RDBMS(关系数据库管理系统),主要5有种: Oracle Database ...
- MySQL SQL概述
MySQL SQL概述 数据库的好处: •实现数据持久化 •使用完整的管理系统统一管理易 数据库的概念: DB:数据库(database):存储数据的“仓库”.它保存了一系列有组织的数据. DBMS: ...
- 每周一书《Oracle 12 c PL(SQL)程序设计终极指南》
本周为大家送出的书是<Oracle 12 c PL(SQL)程序设计终极指南>,此书由机械工业出版社出版, 孙风栋,王澜,郭晓惠 著. 内容简介: <Oracle 12c PL/SQ ...
- [SQL]sql介绍
SQL语言概述 结构化查询语言(Structured Query Language,简称SQL)是一种介于关系代数与关系演算之间的语言,是一种用来与关系数据库管理系统通信的标准计算机语言.其功能包括数 ...
- oracle包概述(一)【weber出品】
一.PL/SQL包概述 1. 什么是PL/SQL包: 相关组件的组合:PL/SQL类型.变量,数据结构,和表达式.子程序: 过程和函数 2. 包的组成部分: 由两部分组成: 包头 包体 3. 包的优点 ...
随机推荐
- MDI端口和MDIX端口是什么? 又有什么作用?
是网线的标准A类接法和B类接法.也就是人们通常所说的交叉网线和直联网线.直联网线就是 白黄 黄 白绿 蓝 白兰 绿 白棕 棕 另一端同样如此.交叉网线就是 另一端的1和3,2和6对调.这样就成了交叉网 ...
- 过度拟合(overfitting)
我们之前解决过一个理论问题:机器学习能不能起作用?现在来解决另一个理论问题:过度拟合. 正如之前我们看到的,很多时候我们必须进行nonlinear transform.但是我们又无法确定Q的值.Q过小 ...
- 在阿里云linux下使用SVN访问VisualSVN出错:SSL handshake failed: SSL error: Key usage violation in certificate has been detected
Subversion clients receive the following error message when attempting to connect to VisualSVN Serve ...
- http 名词解释
get.post.put.delete的安全性和幂等性 安全性:指的是对资料是否有破坏性的操作 幂等性:指的是对资源操作时,数据是一致性.
- oracle 10g
一.安装系统 首先安装Linux系统,根据Oracle官方文档的建议,在机器内存小于1G的情况下,swap分区大小应该设置为内存的2倍大,若内存大于2G则swap分区设置为与内存大小一样. 为防止Or ...
- asp.net mvc 实体类成员变量标识示例
检查不能为空 [Required] public string ID { get; set; } 检查最大长度 [StringLength(36, ErrorMessage = "长度不可超 ...
- 第二百四十一天 how can I 坚持
今天去了趟小米之家,红米note3感觉还好吧.小米,希望不会令人失望啊,很看好的,应该不算是米粉吧. 腾讯课堂. hadoop. 摄影. 没有真正的兴趣啊,一心只想着玩,什么事真正的兴趣,就是无时无刻 ...
- Gym 100507A About Grisha N. (水题)
About Grisha N. 题目链接: http://acm.hust.edu.cn/vjudge/contest/126546#problem/A Description Grisha N. t ...
- 随便看看My97DatePicker源码J方法
如果有一个路径是写错的并且这个路径是写在前面,那么相关的css文件你就别想引进来了 <script language="javascript" type="text ...
- AVCaptureDevice LED闪光灯控制
转载自:http://blog.csdn.net/cloudhsu/article/details/7202368 #import <AVFoundation/AVFoundation.h> ...