原文:SQLServer 2008 技术内幕——T-SQL 查询 笔记

1、SQL编程有许多独特之处,如:面向集合的思维方式、查询元素的逻辑处理顺序、三值逻辑。如果不掌握这些知识就开始用SQL编程,得到的将是冗余的、性能低下的代码,而且难以维护。

2、在SQLServer中负责生成实际工作计划(执行计划)的组件是:查询优化器(query optimizer)。只有在确保结果集正确的前提下,优化器才会走捷径。明确区分查询的逻辑处理和物理处理是非常重要的。

3、逻辑查询的各个阶段:

(5) SELECT (5-2) DISTINCT (5-3) TOP (<top_specification>) (5-1) <select_list>
(1) FROM (1-J) <left_table> <join_type> JOIN <right_table> ON <on_predicate>|(1-A) <left_table> <apply_type> APPLY <right_table_expression> AS <alias>|(1-P) <left_table> PIVOT (<pivot_specification>) AS <alias>|(1-U) <left_table> UNPIVOT (<unpivot_specification>) AS <alias>
(2) WHERE <where_predicate>
(3) GROUP BY <group_by_specification>
(4) HAVING <having_predicate>
(6) ORDER BY <order_by_list>;

第一步:FROM :表示出查询的来源表,在联结运算中涉及的阶段是(1-J1)笛卡儿积、(1-J2)ON筛选器和(1-J3)添加外部行。并生成虚拟表VT1。

1.1、笛卡儿积:两表执行笛卡儿积,生成虚拟表VT1-J1。

1.2、ON筛选器:针对VT1-J1中满足ON为true的行,插入VT1-J2。

1.3、添加外部行:如果指定了OUTER JOIN (相对于CROSS JOIN或INNER JOIN ),则将保留表中没有匹配的行,作为外部行添加,生成VT1-J3。

第二步:WHERE:根据WHERE 子句中的谓词对VT1中的数据进行行筛选,只对结果为TRUE的行,插入VT2。

第三步:GROUP BY :根据group by中的列表,将VT2进行分组,每一组只有一个结果行,生成VT3。

第四步:HAVING:根据HAVING出现的谓词对VT3金信筛选,只让结果为TRUE的组才插入VT4。

第五步:SELECT:处理SELECT 子句中的元素,产生VT5。

5.1、计算表达式:根据SELECT 列表中的表达式,生成VT5-1。

5.2、DISTINCT:删除VT5-1中重复的行,生成VT5-2。

5.3、TOP:根据ORDER BY 子句定义逻辑排序,从VT5-2中选择前面指定数量或百分比的行,生产VT5-3。

第六步:ORDER BY :根据ORDER BY 子句中指定的列名,对VT5-3进行排序。生成游标VC6。

对于三值逻辑:

a、所有的查询筛选器(ON、WHERE 和HAVING )都把null当作FALSE来处理。

b、check约束中的null值被当作TRUE来对待。

c、UNIQUE约束、集合运算(UNION 和EXCEPT)、及排序和分组操作,认为两个null是相等的。

注意:

1、如果FROM 子句中有多个表运算符,则按从左到右的顺序进行处理。每个表运算符的结果作为下一个表运算符的左输入,最后生成虚拟表作为下一阶段的输入。

2、因为在WHERE之前还没对数据分组,所以WHERE 子句不能使用聚合。在筛选器中,ON对保留表中部分行的删除并不是最终的,而WHERE是最终的。只有使用外联结的时候,ON和WHERE才有逻辑区别。

3、如果在查询中指定了GROUP BY ,后续所有步骤都只能在指定的分组上操作。

4、HAVING是唯一可用于分组数据的筛选器。

5、由于SQL具有多个运算同时计算(all-at-once operation),所以SELECT 语句中的逻辑顺序是无关的。

6、ORDER BY 是唯一可以使用SELECT 中别名的步骤。

SQLServer 2008 技术内幕——T-SQL 查询 笔记相关推荐

  1. 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. 分析--> ...

  2. Microsoft SQL Server 2008技术内幕:T-SQL查询——读书笔记(全)

    特别注意: 本笔记不适合初学者 SQL的官方(ANSI)发音是:ess kyooell,但更多的人叫它sequel. ** 第一章:逻辑查询处理** 在sql server中负责实际工作计划执行的是查 ...

  3. 2008技术内幕:T-SQL语言基础 联接查询摘记

    续 2008技术内幕:T-SQL语言基础 单表查询摘记 第三章 联接查询 Microsoft SQL Server 2008 支持四种表运算符 join(ANSI标准).apply(T-SQL扩展). ...

  4. 使用DOS重定位技术执行isqlw(SQL查询分析器)

    作者:chenjieb520 笔者之前在一个项目里面需要调用SQL查询分析器,并且通过命令行的形式将执行结果返回.于是笔者就采用了 DOS重定位技术进行解决.现在简单说明一下如何用VC++来进行实现. ...

  5. 笔记-Microsoft SQL Server 2008技术内幕:T-SQL语言基础-02 单表查询

    SELECT子句中的别名 SELECT子句是在FROM.WHERE.GROUP BY,以及HAVING子句后处理的,这意味着对于SELECT子句之前处理的那些子句,在SELECT子句中为表达式分配的别 ...

  6. Microsoft SQL Server 2008技术内幕:T-SQL查询---------查询优化

    示例数据库: -- Sample Data for this Chapter -- Listing 4-1: Creation Script for Sample Database and Table ...

  7. 笔记-Microsoft SQL Server 2008技术内幕:T-SQL语言基础-08 数据修改

    插入数据 T-SQL提供了几种数据插入的语句:INSERT VALUES.INSERT SELECT.INSERT EXEC.SELECT INTO及BULK INSERT. INSERT VALUE ...

  8. Microsoft SQL Server 2008技术内幕:T-SQL查询---------逻辑查询处理

    Three-Valued Logic(三值逻辑) SQL values: TRUE, FALSE, UNKNOWN 由于查询筛选器中 (ON, WHERE, and HAVING) 将UNKNOW认定 ...

  9. mysql idataparameter_MySQL技术内幕——InnoDB存储引擎笔记

    第一章 MySQL体系结构和存储引擎 1.1 定义数据库和实例 数据库 :物理操作系统文件或其他形式类型文件的集合 实例 : MySQL数据库由后台线程以及一个共享内存区组成. Mysql数据库实例在 ...

最新文章

  1. 只需三分钟您就可以用nodejs搭建静态网页服务器(配置静态网页访问目录)
  2. 机器人工具箱 V9.10(Robotics Toolbook) (1):建立机器人模型
  3. 【数据结构与算法】之深入解析“四数之和”的求解思路与算法示例
  4. Skywalking部署常见问题以及注意事项
  5. plotly django_使用Plotly为Django HTML页面进行漂亮的可视化
  6. 从前,小夕种了一棵树
  7. tensorflow计算图_通过从头开始模仿其API来了解TensorFlow
  8. js继承实现 狗类继承动物类
  9. java反射机制中的getDeclaredField()
  10. Eigen教程(3)之矩阵和向量的运算
  11. 算法和数据结构---排序---插入排序
  12. android如何去掉自动更新,如何停止Android手机上的应用程序自动更新
  13. mysql的engine不同,导致事物回滚失败的问题
  14. Redhat7系统root用户密码破解
  15. Springboot 集成 Camunda
  16. 电信光猫F660 4台限制破解
  17. Power BI时间智能
  18. openinstall的价值就是帮助App开发者成功
  19. Excel中怎样固定单元格?
  20. 使用moment.js获取一个自然周开始日期和结束日期

热门文章

  1. SQL Server (MSSQLSERVER) 启动又停止
  2. linux之ssh-keygen命令
  3. html怎么限制密码字母个数字,怎样限制密码长度,并且只能为字母数字及下划线组成?...
  4. Java G1 GC 垃圾回收深入浅出
  5. [FPGA] 2、新建并运行一个工程
  6. hive学习2(Navicat连接hive)
  7. Canvas -画图 关键字
  8. linux下mysql启动和关闭
  9. cairo在Gecko上实现的路线图
  10. Lua语言面向对象之复制表的方式面向对象