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 查询 笔记相关推荐
- 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. 分析--> ...
- Microsoft SQL Server 2008技术内幕:T-SQL查询——读书笔记(全)
特别注意: 本笔记不适合初学者 SQL的官方(ANSI)发音是:ess kyooell,但更多的人叫它sequel. ** 第一章:逻辑查询处理** 在sql server中负责实际工作计划执行的是查 ...
- 2008技术内幕:T-SQL语言基础 联接查询摘记
续 2008技术内幕:T-SQL语言基础 单表查询摘记 第三章 联接查询 Microsoft SQL Server 2008 支持四种表运算符 join(ANSI标准).apply(T-SQL扩展). ...
- 使用DOS重定位技术执行isqlw(SQL查询分析器)
作者:chenjieb520 笔者之前在一个项目里面需要调用SQL查询分析器,并且通过命令行的形式将执行结果返回.于是笔者就采用了 DOS重定位技术进行解决.现在简单说明一下如何用VC++来进行实现. ...
- 笔记-Microsoft SQL Server 2008技术内幕:T-SQL语言基础-02 单表查询
SELECT子句中的别名 SELECT子句是在FROM.WHERE.GROUP BY,以及HAVING子句后处理的,这意味着对于SELECT子句之前处理的那些子句,在SELECT子句中为表达式分配的别 ...
- 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认定 ...
- mysql idataparameter_MySQL技术内幕——InnoDB存储引擎笔记
第一章 MySQL体系结构和存储引擎 1.1 定义数据库和实例 数据库 :物理操作系统文件或其他形式类型文件的集合 实例 : MySQL数据库由后台线程以及一个共享内存区组成. Mysql数据库实例在 ...
最新文章
- 只需三分钟您就可以用nodejs搭建静态网页服务器(配置静态网页访问目录)
- 机器人工具箱 V9.10(Robotics Toolbook) (1):建立机器人模型
- 【数据结构与算法】之深入解析“四数之和”的求解思路与算法示例
- Skywalking部署常见问题以及注意事项
- plotly django_使用Plotly为Django HTML页面进行漂亮的可视化
- 从前,小夕种了一棵树
- tensorflow计算图_通过从头开始模仿其API来了解TensorFlow
- js继承实现 狗类继承动物类
- java反射机制中的getDeclaredField()
- Eigen教程(3)之矩阵和向量的运算
- 算法和数据结构---排序---插入排序
- android如何去掉自动更新,如何停止Android手机上的应用程序自动更新
- mysql的engine不同,导致事物回滚失败的问题
- Redhat7系统root用户密码破解
- Springboot 集成 Camunda
- 电信光猫F660 4台限制破解
- Power BI时间智能
- openinstall的价值就是帮助App开发者成功
- Excel中怎样固定单元格?
- 使用moment.js获取一个自然周开始日期和结束日期