最近在看《Microsoft SQL Server 2008 技术内幕:T-SQL查询》这本书,受益匪浅。准备写点东西记录一下我的学习过程。

首先简单提一下T-SQL。T-SQL的正式名称是Transact-SQL,是ANSI和ISO SQL标准的Microsoft SQL Server扩展,而PL/SQL是ORACLE对SQL标准的扩展。

对于T-SQL编程,用得最广泛的,莫过于查询(Querying)。要想写出高质量、高性能的查询语句,必须深入地了解逻辑查询处理。

一、逻辑查询处理的各个阶段

(5)SELECT DISTINCT TOP(<top_specification>) <select_list>

(1)FROM <left_table> <join_type> JOIN <right_table> ON <on_predicate>

(2)WHERE <where_predicate>

(3)GROUP BY <group_by_specification>

(4)HAVING <having_predicate>

(6)ORDER BY <order_by_list>

上边语句是一个普通格式的查询语句,基本包含了所有的查询条件和关键字。你可能会发现前边的序号并不是按顺序来的,被你说对了,这是SQL与其他编程语言不同的最明显特征,就是它的执行顺序并不是按照编写顺序来的。上边的序号,就是查询语句在执行过程中的逻辑处理顺序。下面简单介绍一下各个阶段都干了啥事。

(1)FROM 阶段

FROM阶段标识出查询的来源表,并处理表运算符。在涉及到联接运算的查询中(各种join),主要有以下几个步骤:

  a.求笛卡尔积。不论是什么类型的联接运算,首先都是执行交叉连接(cross join),求笛卡儿积,生成虚拟表VT1-J1。

b.ON筛选器。这个阶段对上个步骤生成的VT1-J1进行筛选,根据ON子句中出现的谓词进行筛选,让谓词取值为true的行通过了考验,插入到VT1-J2。

c.添加外部行。如果指定了outer join,还需要将VT1-J2中没有找到匹配的行,作为外部行添加到VT1-J2中,生成VT1-J3。

经过以上步骤,FROM阶段就完成了。概括地讲,FROM阶段就是进行预处理的,根据提供的运算符对语句中提到的各个表进行处理(除了join,还有apply,pivot,unpivot)

(2)WHERE阶段

WHERE阶段是根据<where_predicate>中条件对VT1中的行进行筛选,让条件成立的行才会插入到VT2中。

(3)GROUP BY阶段

GROUP阶段按照指定的列名列表,将VT2中的行进行分组,生成VT3。最后每个分组只有一行。

(4)HAVING阶段

该阶段根据HAVING子句中出现的谓词对VT3的分组进行筛选,并将符合条件的组插入到VT4中。

(5)SELECT阶段

  这个阶段是投影的过程,处理SELECT子句提到的元素,产生VT5。这个步骤一般按下列顺序进行

a.计算SELECT列表中的表达式,生成VT5-1。

b.若有DISTINCT,则删除VT5-1中的重复行,生成VT5-2

c.若有TOP,则根据ORDER BY子句定义的逻辑顺序,从VT5-2中选择签名指定数量或者百分比的行,生成VT5-3

(6)ORDER BY阶段

根据ORDER BY子句中指定的列明列表,对VT5-3中的行,进行排序,生成游标VC6.

当然SQL SERVER在实际的查询过程中,有查询优化器来生成实际的工作计划。以何种顺序来访问表,使用什么方法和索引,应用哪种联接方法,都是由查询优化器来决定的。优化器一般会生成多个工作计划,从中选择开销最小的那个去执行。逻辑查询处理都有非常特定的顺序,但是优化器常常会走捷径。

详细的介绍,待续。

参考文献:《Microsoft SQL Server 2008 技术内幕:T-SQL查询》

转载于:https://www.cnblogs.com/JimmyGe/archive/2011/03/09/1979172.html

T-SQL查询处理详解相关推荐

  1. oracle 查询语句取别名,实用sql查询语句详解1:给列取别名、查询部分行、多列排序...

    SQL(Structured Query Language)是用于访问和处理数据库的标准计算机语言,是所有数据库查询的语言,无论是高级查询还是低级查询, 文章介绍了包括查询全部的行和列.给列取别名.查 ...

  2. mysql模糊查询实例_Mysql实例sql模糊查询实例详解

    <Mysql实例sql模糊查询实例详解>要点: 本文介绍了Mysql实例sql模糊查询实例详解,希望对您有用.如果有疑问,可以联系我们. 导读:常用的模糊查询语句:select 字段 fr ...

  3. hibernate(七) hibernate中查询方式详解

    序言 之前对hibernate中的查询总是搞混淆,不明白里面具体有哪些东西.就是因为缺少总结.在看这篇文章之前,你应该知道的是数据库的一些查询操作,多表查询等,如果不明白,可以先去看一下 MySQL数 ...

  4. 069:ORM查询条件详解-isnull和regex

    ORM查询条件详解-isnull和regex: isnull: 根据值是否为空进行查找.示例代码如下: articles = Article.objects.filter(create_time__i ...

  5. Java程序员从笨鸟到菜鸟之(一百)sql注入攻击详解(一)sql注入原理详解

    前段时间,在很多博客和微博中暴漏出了12306铁道部网站的一些漏洞,作为这么大的一个项目,要说有漏洞也不是没可能,但其漏洞确是一些菜鸟级程序员才会犯的错误.其实sql注入漏洞就是一个.作为一个菜鸟小程 ...

  6. MySQL日志文件之错误日志和慢查询日志详解

    今天天气又开始变得很热了,虽然很热很浮躁,但是不能不学习,我在北京向各位问好.今天给大家分享一点关于数据库日志方面的东西,因为日志不仅讨厌而且还很重要,在开发中时常免不了与它的亲密接触,就在前几天公司 ...

  7. 查看oracle监听服务状态,(总结)Oracle监听服务lsnrctl参数及查询状态详解

    lsnrctl命令常用参数详解: lsnrctl start 启动指定的监听器 stop 关闭指定的监听器 status 显示监听器的状态.status命令显示监听器是不是活动的,日志与跟踪文件的位置 ...

  8. 066:ORM查询条件详解-startswith和endswith:

    ORM查询条件详解-startswith和endswith: startswith: 判断某个字段的值是否是以某个值开始的.大小写敏感.示例代码如下: articles1 = Article.obje ...

  9. 用JDBC直连方式访问SQL Server 2005详解

    用JDBC直连方式访问SQL Server 2005详解 1.安装JDK,配置其环境变量:(笔者所用版本为1.6版) (1)从官方网http://java.sun.com/jdk下载安装文件. (2) ...

  10. 067:【Django数据库】ORM查询条件详解-range

    [Django数据库]ORM查询条件详解-range range: 判断某个 field 的值是否在给定的区间中.示例代码如下: # views.py文件内容:from datetime import ...

最新文章

  1. 拒绝 ! = null
  2. android.graphics.Paint方法setXfermode (Xfermode x...
  3. P1991 无线通讯网
  4. oracle 报错pls 00405,oracle - 检查是否存在PLS-00405:在此上下文中不允许子查询 - 堆栈内存溢出...
  5. 基础JavaScript_Day01
  6. mac上安装webpack报错解决方法Hit error EACCES: permission denied, mkdir ‘/usr/local/lib/node_modules/webpack
  7. 【信息学奥赛一本通】题解目录答案
  8. 高等数学|微积分(上)知识点总结
  9. php面试题 几升水,三个水桶等分8升水的问题 -《算法的乐趣》
  10. 【视频MV】laislabonita美丽的海岛*女歌星Alizee(艾莉婕)
  11. NLP(四十二)人物关系分类的再次尝试
  12. java泛型:T与?的使用及区别
  13. Python环境下数据处理常用命令
  14. Python 在windows上跑图色脚本?简单又好玩,自己编写一个自动化脚本
  15. POM文件配置的详解
  16. 世界杯期间随想(摘自本人新浪微博)
  17. Java系列之JDBC和ODBC之间的区别与联系
  18. EVA新世纪福音战士剧场版:终 阿里云盘、百度网盘资源
  19. 操作系统_进程管理_进程的控制与同步
  20. 使用IDEA把项目上传到gitee仓库

热门文章

  1. WINDOWS游戏编程大师技巧-常见编绎连接错误FAQ
  2. linux安装 wegt_linux 下安装wget
  3. UGUI的Canvas
  4. Linux网络编程——端口复用(多个套接字绑定同一个端口----避免服务器重启时,端口绑定不上)
  5. linux 线程同步与互斥:读写锁 线程读操作较多,写操作较少时,使用读写锁
  6. eclipse-memory-analyzer使用说明
  7. java 富文本 xss_Jsoup 防止富文本 XSS 攻击
  8. 读取文本节点_Python文本处理教程(2)
  9. Json文件转Map(三)之获取嵌套Map值
  10. 【渝粤教育】国家开放大学2019年春季 0755-22T学前儿童艺术教育 参考试题