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

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
简介: 原文: SQLServer 2008 技术内幕——T-SQL 查询 笔记 1、SQL编程有许多独特之处,如:面向集合的思维方式、查询元素的逻辑处理顺序、三值逻辑。
原文: 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 中别名的步骤。







相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS&nbsp;SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/sqlserver
目录
相关文章
|
7天前
|
SQL 人工智能 算法
【SQL server】玩转SQL server数据库:第二章 关系数据库
【SQL server】玩转SQL server数据库:第二章 关系数据库
45 10
|
9天前
|
SQL
sql语句加正则 简化查询
sql语句加正则 简化查询
12 0
sql语句加正则 简化查询
|
27天前
|
SQL
sql server链接查询
sql server链接查询
17 1
|
27天前
|
SQL
sql server简单查询
sql server简单查询
14 1
|
17天前
|
SQL 关系型数据库 MySQL
mysql一条sql查询出多个统计结果
mysql一条sql查询出多个统计结果
13 0
|
7天前
|
SQL 算法 数据库
【SQL server】玩转SQL server数据库:第三章 关系数据库标准语言SQL(二)数据查询
【SQL server】玩转SQL server数据库:第三章 关系数据库标准语言SQL(二)数据查询
61 6
|
27天前
|
SQL
sql高级查询
sql高级查询
12 0
|
10天前
|
SQL 存储 关系型数据库
【MySQL实战笔记】02.一条SQL更新语句是如何执行的-2
【4月更文挑战第5天】两阶段提交是为确保`redo log`和`binlog`逻辑一致,避免数据不一致。若先写`redo log`, crash后数据可能丢失,导致恢复后状态错误;若先写`binlog`,crash则可能导致重复事务,影响数据库一致性。一天一备相较于一周一备,能缩短“最长恢复时间”,但需权衡额外的存储成本。
15 1
|
20天前
|
SQL 关系型数据库 MySQL
【MySQL技术之旅】(7)总结和盘点优化方案系列之常用SQL的优化
【MySQL技术之旅】(7)总结和盘点优化方案系列之常用SQL的优化
36 1
|
28天前
|
SQL 数据库
sql server高级查询,看这篇文章就够了
sql server高级查询,看这篇文章就够了
21 0