网购京东: http://item.jd测试数据/11692900.html
网购当当: http://product.dangdang测试数据/23702533.html
前言
本书第 1 版是在四年前出版的,但至今仍在被众多的 SQL 爱好者追捧,甚至不辞辛劳地逐页扫描,上传至网络进行分享。本书第 1 版是基于 SQL Server 2008 编写的。时光荏苒,目前 SQL Server 2014 已经发布,窗口函数等新功能不断被丰富和发展,先前需要编写很复杂的代码才能完成的工作,现在寥寥几行就能把问题搞定。无论是从代码可读性还是执行效率方面看, SQL Server 2014 都值得我们去深入学习。因此,我们在第 1 版的基础上,对书的内容重新进行了补充和完善。此外,这次我们还补充了一些像“三值逻辑”这样的基础知识,因为在实际工作中,我经常发现,由于存在 NULL 值比较问题,导致查询结果不正确,费尽千辛万苦地分析代码,最终却发现犯了低级错误。
当初之所以要写这本书,主要出于两方面的原因:一是伴随着各种数据库技术日新月异的发展,无论是哪种数据库产品,想用有限的篇幅去描述它的全貌,几乎是不可能完成的任务,所以我就考虑能否抽取出各种数据库产品中一些大家共同关心的内容,进行深入细致的挖掘,而 SQL 无疑是这方面的首选;二是在与一些开发公司的合作中,发现公司间的 SQL 应用情况也差异很大,一些公司出于产品的可移植性考虑,拒绝使用一些新的 SQL 技术,甚至尽量避免在服务器上部署存储过程,所以我希望在深入地讨论一些常用 SQL 技术的同时,也尽可能多地介绍一些 SQL 的新技术,从而消除大家对新技术的恐惧感,对新技术的推广能够起到一定的作用。
本书特点
本书既覆盖了改善效率和性能的普通 SQL 技术,也深入探讨了 SQL 新技术,更包含一些实用的查询解决方案,希望本书能够成为引领读者进入 SQL 查询殿堂的捷径。
本书的内容是基于 SQLServer 数据库产品进行讨论的。不过,由于大家都在遵循 ANSI-SQL 标准,所以无论是哪种数据库产品的 SQL ,彼此之间的差别并不大。数据库开发人员在跨越不同的数据库产品时,一般不会遇到什么障碍。当然,本书不特定于某个 SQL Server 版本,在介绍一些新功能时,会介绍它是在哪个版本添加进来的。并且,本书在改写过程中,在添加新的查询解决方案的同时,保留了先前的解决方案,以便读者能够进行对比分析。
本书在介绍各种查询语法时,更注重对查询逻辑思维方式的引导和介绍,只有这样,才可以帮助读者在阅读之后举一反三,提升自己动手解决实际问题的能力。
本书适用读者
本书是按照由浅入深、循序渐进方式对 SQL 进行介绍的,既包含了入门知识,也包含了深层次技术的讨论。即使是最基本的查询语句,我们也会尽力为读者提供解决深层次问题的能力。也就是说,同样一个问题,开发人员可以写几十甚至上百行的 SQL 语句来解决问题,也有可能仅通过一条 SELECT 语句就可以解决问题。对于 SQL 而言,虽然代码最简化并不一定是性能最优化,但至少是对思维能力的一种提升。
从这个角度而言,本书可以作为 SQL 入门书籍,也可以作为 SQL 程序员、 DBA 的参考书籍。
本书内容与结构
本书共 19 章,可大致分为基础篇、开发篇、性能调整篇和实战篇 4 个部分。
基础篇包括第 1 章至第 10 章。其中,第 1 章是对查询工具、书写规范等基本内容的介绍,第 2 章至第 5 章是对数据库、表和索引的介绍,第 5 章至第 10 章则介绍了使用 SELECT 进行数据查询和使用 INSERT 、 UPDATE 、 DELETE 进行数据修改的各个方面。本次修订新增了 SQL 理论基础、新增函数介绍、架构概念、标识列和序列对象等一致性约束介绍、内存表、选择列表的同时操作概念、查询的逻辑处理步骤的修订、使用 OFFSET-FETCH 限制查询结果和限制查询修改、窗口分布函数和窗口偏移函数、 MERGE 与 OUTPUT 等,尤其是对于第 9 章的窗口计算部分,更是全部重新书写。
开发篇包括第 11 章至第 15 章。如果将 SELECT 、 INSERT 、 UPDATE 和 DELETE 作为基本查询语句,则 IF...ELSE 、 WHILE 和 TRY...CATCH 构造等则可以看作是 SQL 编程语句。在存储过程、触发器等对象中可以通过这些语句实现一些复杂的逻辑处理。如果你曾经是一位使用 VB 或 VC 程序员,在学习 C/S 或 B/S 编程时,你应当掌握这种服务器端的编程工具,从而将业务逻辑计算合理地分布到服务器和客户端。本次修订对 CLR 存储过程、触发器、函数等以 VisualStudio 2013 为基础重新进行了编写。
性能调整篇包括第 16 章至第 18 章。第 16 章和第 17 章介绍的是事务处理机制和并发访问控制。其实,无论是微软还是 Oracle 、 IBM ,其数据库产品的核心功能都是一样的,即在保证数据完整性的前提下提供最大的并发支持。数据库系统是通过“锁机制”来实现的,数据库引擎都提供有多种粒度的锁定模式,从而允许用户可以根据需要将资源锁定在适当的级别,尽量减少锁定开销。第 18 章则是讨论了查询优化器的工作原理,重用查询计划,可以减少额外的编译开销,提高服务器性能。
实战篇仅包含第 19 章的内容,提供了同一时间范围内并发数统计、时间段天数统计、数字范围统计、地域范围内最大数统计等较为常用问题的解决方案。本次修订在原解决方案的基础上中新增了窗口函数解决方案。
系统要求
本书实例中使用的操作系统是 Windows7 ,使用的数据库是 SQLServer 2014 开发者版本,开发工具是 VisualStudio 2013 。为使 VisualStudio 2013 能够支持 SQL Server2014 的 SQL 开发,需要将其升级到最新版本。同时,由于 SQL Server 示例数据库在 2014 中表结构变动较大,因此对书中的代码重新进行了调整和测试,该示例数据库可从 http://msftdbprodsamples.codeplex测试数据/releases/view/125550 下载。
目录(含主要调整说明)及试读(可以在博客中搜索“锋利的SQL2014”,也可直接单击下面的链接)
第 1 章 SQL 简介
1.1 SQL 的历史起源
1.1.1 CODASYL
1.1.2 IMS
1.1.3 RDBMS 和 SQL
1.1.4 ANSI 和 SQL 方言
1.2 SQL 的理论基础(新增)
1.2.1 集合理论
1.2.2 谓词逻辑
1.2.3 关系模型
1.3 Transact-SQL 语言的类型
1.3.1 DDL 语句
1.3.2 DML 语句
1.3.3 编程和流控制语句
1.3.4 SQL 语句的批处理
1.4 Transact-SQL 语法
1.4.1 标识符
1.4.2 数据类型
1.4.3 函数
1.4.4 表达式
1.4.5 运算符
1.4.6 注释
1.4.7 保留关键字
1.5 常量和变量
1.5.1 常量
1.5.2 变量
1.6
1.6.1 算术运算符
1.6.2 赋值运算符
1.6.3 位运算符
1.6.4 比较运算符
1.6.5 逻辑运算符
1.6.6 字符串串联运算符
1.6.7 一元运算符
1.7 常用函数
1.7.1 聚合函数
1.7.2 配置函数
1.7.3 游标函数
1.7.4 日期和时间函数(重写)
1.7.5 数学函数
1.7.6 数据类型转换函数
1.7.7 字符串函数
1.7.8 文本和图像函数
1.7.9 逻辑函数(新增)
1.8 查询工具
1.8.1 Management Studio
1.8.2 sqlcmd
1.9 SQL 书写规范
1.9.1 大小写规范
1.9.2 使用空格
1.9.3 使用缩进
1.9.4 使用垂直空白道
1.9.5 使用分组
第 2 章 数据库与架构
2.1 SQL Server 数据库基础(新增)
2.1.1 数据库的服务方式
2.1.2 数据库实例
2.1.3 架构与对象
2.1.4 数据库文件和文件组
2.2 创建数据库
2.2.1 CREATEDATABASE 语句的语法格式
2.2.2 创建数据库示例
2.2.3 判断数据库是否已经存在
2.3 修改数据库
2.3.1 扩展数据库和文件
2.3.2 向数据库中添加、删除和修改文件组
2.3.3 收缩数据库和文件
2.3.4 设置数据库选项
2.3.5 重命名数据库
2.4 删除数据库
2.5 架构管理(新增)
2.5.1 创建架构
2.5.2 修改架构
2.5.3 移动对象到一个新架构中
2.5.4 删除架构
第 3 章 表管理
3.1 表的物理存储方式
3.1.1 数据页
3.1.2 区
3.2 创建表
3.2.1 创建基本表
3.2.2 使用 NULL 约束
3.2.3 使用默认约束和标识列(重写)
3.2.4 其他数据完整性设置(新增)
3.3 修改表
3.3.1 为表添加新列
3.3.2 修改表中的列
3.3.3 删除表中的列
3.4 重命名和删除表
3.5 临时表
3.5.1 本地表和全局表
3.5.2 表变量
3.6 内存优化表(新增)
第 4 章 索引管理
4.1 索引的基础知识
4.1.1 索引的类型
4.1.2 索引的特征
4.1.3 常规索引设计规则
4.2 创建索引
4.2.1 最大索引限制
4.2.2 限制索引参与的数据类型
4.2.3 创建聚集索引
4.2.4 创建非聚集索引
4.2.5 创建具有包含性列的索引
4.2.6 为计算列创建索引
4.3 修改索引
4.3.1 禁用索引
4.3.2 重新组织和重新生成索引
4.3.3 设置索引选项
4.3.4 重命名索引
4.4 删除索引
第 5 章 基本查询
5.1 基本的 SELECT 语句
5.1.1 SELECT 语句的结构
5.1.2 数据库对象的引用规则
5.2 使用选择列表和表别名
5.2.1 选择所有列
5.2.2 选择特定列
5.2.3 使用常量、函数和表达式(重写)
5.2.4 用表别名
5.3 使用 WHERE 子句筛选行
5.3.1 用比较搜索条件(重写)
5.3.2 使用范围搜索条件
5.3.3 使用列表搜索条件
5.3.4 使用模式匹配搜索条件
5.3.5 使用 NULL 比较搜索条件(重写)
5.4 使用 GROUP BY 子句进行分组计算
5.5 使用 HAVING 子句从中间结果筛选行
5.6 使用 ORDER BY 子句进行排序
5.6.1 指定排序列
5.6.2 指定排序顺序
5.6.3 指定排序规则
5.7 使用 TOP 和 OFFSET-FETCH 限制结果集(重写)
5.7.1 使用 TOP 选项
5.7.2 使用 OFFSET-FETCH 筛选
5.7.3 使用 SET ROWCOUNT 语句
5.8 使用 DISTINCT 消除重复行(重写)
5.9 同时操作(新增)
5.10 查询的逻辑处理(重写)
5.10.1 逻辑处理过程简介
5.10.2 步骤 1 : FROM
5.10.3 步骤 2 :使用 WHERE 筛选器
5.10.4 步骤 3 :数据分组
5.10.5 步骤 4 :使用 HAVING 筛选器
5.10.6 步骤 5 :处理 SELECT 列表
5.10.7 步骤 6 :使用 ORDER BY 子句
5.10.8 步骤 7 :使用 TOP 或 OFFSET/FETCH
第 6 章 子查询
6.1 在选择列表中使用子查询
6.1.1 子查询示例
6.1.2 子查询与联接的关系
6.2 含有 IN 和 EXISTS 的子查询
6.2.1 含有 IN 的子查询
6.2.2 含有 EXISTS 的子查询
6.2.3 含有 NOT IN 和 NOT EXISTS 的子查询
6.3 含有比较运算符的子查询
6.4 使用 ANY 、 SOME 或 ALL 关键字
6.5 使用多层嵌套子查询(重写)
6.6 子查询应遵循的规则(重写)
第 7 章 联接和 APPLY 运算符
7.1 联接的基本知识
7.1.1 联接的语法格式
7.1.2 联接所使用的逻辑处理阶段
7.1.3 列名限定和选择列表的使用
7.1.4 联接条件设定
7.2 交叉联接
7.2.1 交叉联接的语法格式
7.2.2 使用交叉联接查询全部数据
7.2.3 使用交叉联接优化查询性能
7.2.4 为交叉联接添加 WHERE 子句
7.3 内部联接
7.3.1 内部联接的语法格式
7.3.2 等值内部联接
7.3.3 不等值联接
7.4 外部联接
7.4.1 外部联接的语法格式
7.4.2 左外部联接
7.4.3 右外部联接
7.4.4 完全外部联接
7.5 自联接
7.5.1 使用不同列实现自联接
7.5.2 使用同一列实现自联接
7.6 多表联接
7.6.1 顺序联接
7.6.2 嵌套联接
7.6.3 指定联接的物理顺序
7.6.4 多表联接示例
7.7 联接算法
7.7.1 嵌套循环联接
7.7.2 合并联接
7.7.3 哈希联接
7.7.4 使用联接提示强制联接策略
7.8 使用 APPLY 运算符
第 8 章 操作结果集
8.1 合并结果集
8.1.1 UNION 与 UNION ALL
8.1.2 使用 ORDER BY 子句
8.1.3 结果集的合并顺序
8.2 查询结果集的差异行
8.2.1 使用 EXCEPT 运算符
8.2.2 查询全部差异行
8.3 查询结果集的相同行
8.3.1 使用 INTERSECT 运算符
8.3.2 查询全部相同行
8.4 UNION 、 EXCEPT 和 INTERSECT 的执行顺序
8.5 在其他语句中使用 UNION 、 EXCEPT 和 INTERSECT
8.5.1 在结果集操作中使用 INTO 子句
8.5.2 突破结果集操作的限制
8.6 使用公用表表达式
8.6.1 CTE 的语法结构
8.6.2 多个 CTE 定义和 CTE 的多次引用
8.6.3 CTE 的间接嵌套
8.6.4 使用递归 CTE
8.7 汇总数据
8.7.1 使用 CUBE 汇总数据
8.7.2 使用 ROLLUP 汇总数据
8.7.3 区分空值和汇总值
8.7.4 返回指定维度的汇总(重写)
第 9 章 窗口计算和表旋转
9.1 窗口和开窗函数简介
9.2 基于窗口的聚合计算
9.2.1 窗口的分区
9.2.2 窗口的排序与框架
9.2.3 开窗聚合函数的嵌套
9.2.4 分区聚合计算与联接的比较
9.3 基于窗口的排名计算
9.3.1 ROW_NUMBER 函数
9.3.2 RANK 和 DENSE_RANK 函数
9.3.3 NTILE 函数
9.4 基于窗口的分布计算
9.4.1 PERCENT_RANK 函数
9.4.2 CUME_DIST 函数
9.4.3 PERCENTILE_CONT 和 PERCENTILE_DISC 函数
9.5 基于窗口偏移计算
9.5.1 LAG 和 LEAD 函数
9.5.2 FIRST_VALUE 和 LAST_VALUE 函数
9.6 表旋转
9.6.1 PIVOT 运算符
9.6.2 UNPIVOT 运算符
第 10 章 数据修改
10.1 插入数据
10.1.1 使用 INSERT 和 VALUES 插入行
10.1.2 使用 INSERT 和 SELECT 子查询插入行
10.1.3 使用 INSERT 和 EXEC 插入行
10.1.4 使用 SELECT INTO 插入行
10.1.5 使用 BULK INSERT 从文件插入行(新增)
10.2 更新数据
10.2.1 使用 SET 和 WHERE 子句更新数据
10.2.2 使用 FROM 子句更新数据
10.2.3 使用 CTE 和视图更新数据
10.3 删除数据
10.3.1 使用 DELETE 删除行
10.3.2 使用 TRUNCATE TABLE 删除所有行
10.4 合并数据(新增)
10.5 使用 TOP 和 OFFSET-FETCH 限制修改(重写)
10.5.1 限制插入数据
10.5.2 限制更新数据
10.5.3 限制删除数据
10.6 使用 OUTPUT 输出受影响行的信息
10.6.1 INSERT 与 OUTPUT
10.6.2 DELETE 与 OUTPUT
10.6.3 UPDATE 与 OUTPUT
10.6.4 MERGE 与 OUTPUT (新增)
第 11 章 视图
11.1 创建视图
11.1.1 创建简单视图
11.1.2 创建索引视图
11.1.3 创建分区视图
11.2 修改视图
11.3 更新视图中的数据
11.4 删除和重命名视图
第 12 章 游标
12.1 创建游标的步骤
12.2 快速只进游标和可滚动游标
12.3 静态游标、动态游标和由键集驱动的游标
12.4 使用可更新游标进行数据更新
第 13 章 存储过程
13.1 存储过程的类型
13.1.1 用户定义的存储过程
13.1.2 扩展存储过程
13.1.3 系统存储过程
13.2 SQL 存储过程
13.2.1 创建存储过程
13.2.2 修改存储过程
13.2.3 存储过程的重新编译
13.2.4 存储过程的错误处理
13.3 CLR 存储过程
13.3.1 创建一个具有输出参数的 CLR 存储过程
13.3.2 创建返回行集和信息的 CLR 存储过程
13.3.3 删除 CLR 存储过程和程序集
13.3.4 CLR 与 SQL 存储过程的择取建议
13.4 嵌套存储过程
第 14 章 触发器
14.1 DML 触发器
14.1.1 AFTER 触发器
14.1.2 进行事务提交和回滚操作
14.1.3 检测对指定列的 UPDATE 或 INSERT 操作
14.1.4 指定 First 和 Last 触发器
14.1.5 嵌套和递归触发器
14.1.6 INSTEADOF 触发器
14.2 使用 DDL 触发器
14.2.1 激发 DDL 触发器的 DDL 事件和事件组
14.2.2 创建 DDL 触发器
14.3 CLR 触发器(重写)
14.3.1 SqlTriggerContext 类
14.3.2 创建 CLR DML 触发器的步骤
14.3.3 创建 CLR DDL 触发器的步骤
14.4 修改、删除和禁用触发器
14.4.1 DML 触发器
14.4.2 DDL 触发器
14.4.3 CLR 触发器
第 15 章 用户自定义函数
15.1 标量 UDF
15.2 表值 UDF
15.2.1 使用内联式表值 UDF 实现参数化视图功能
15.2.2 使用多语句式表值 UDF 进行复杂计算
15.3 CLR UDF
15.3.1 标量 UDF
15.3.2 表值 UDF
15.3.3 聚合 UDF
15.4 修改和删除 UDF
第 16 章 事务处理
16.1 自动事务处理
16.2 显式事务处理
16.3 隐式事务处理
16.4 使用嵌套事务
16.5 使用事务保存点
第 17 章 并发访问控制
17.1 并发影响和并发控制类型
17.1.1 并发影响
17.1.2 并发控制
17.2 锁管理器的数据锁定
17.2.1 锁的粒度和层次结构
17.2.2 锁的模式
17.2.3 锁的兼容性
17.2.4 锁升级
17.3 自定义锁定
17.3.1 自定义锁的超时时间
17.3.2 使用表级锁提示
17.4 使用事务隔离级别
17.5 使用行版本的事务隔离级别
17.5.1 快照隔离和行版本控制的工作原理
17.5.2 使用基于行版本控制的隔离级别
17.6 处理死锁
17.6.1 防止死锁的方法
17.6.2 使用 TRY...CATCH 处理死锁
第 18 章 查询的优化与执行
18.1 查询的优化
18.1.1 查询计划定义的内容
18.1.2 生成查询计划
18.2 执行计划的缓存与执行
18.2.1 执行计划的副本和执行上下文
18.2.2 执行计划的开销管理
18.3 执行计划的重用
18.3.1 通过简单参数化提高计划重用率
18.3.2 通过强制参数化提高计划重用率
18.3.3 使用显式参数化提高计划重用率
18.4 执行计划的重新编译
第 19 章 SQL 查询演练
19.1 同一时间范围内并发数统计
19.1.1 使用子查询
19.1.2 使用 CTE
19.1.3 使用窗口函数(新增)
19.2 时间段天数统计(重写)
19.3 数字范围统计
19.3.1 查找剩余空位区间和剩余空位编号
19.3.2 查找已用货位区间
19.4 地域范围内最大数统计
19.5 从分组中取前几行数据
19.5.1 使用联接获取前几行
19.5.2 使用窗口排名函数获取前几行
19.6 取出多列中的非空值
19.6.1 姓名问题处理
19.6.2 工资问题处理
19.7 将数据由行转换为列
19.8 层次结构操作(新增)
19.8.1 检索祖先节点
19.8.2 检索子树节点
19.8.3 插入新节点
19.8.4 变更节点位置
19.8.5 hierarchyid 的索引策略
新书:锋利的SQL(第2版)开始发售及代码下载
标签:锋利的sql 张洪举 sql server 2014
查看更多关于新书:锋利的SQL(第2版)开始发售及代码下载的详细内容...