那么多SQL书,为什么这本成为了经典?

2018 年 7 月 20 日 图灵教育

SQL 是数据库世界的语言。如果你从事与关系数据库相关的开发工作或者数据报表工作,那么把数据存入数据库并将其再次读取出来的能力最终取决于你所具备的 SQL 知识。

谈到 SQL,想必大家脑子里会立刻反射出四个字——增删改查。作为使用最为广泛的数据库语言,SQL 有很多优点,它通用性强、简单易学且贴近英语语法。如果你做最基本的操作,可能花两周的时间就能学会如何初步使用它。

图灵之前就出版过一些深受读者喜爱的 SQL 图书。有麻省理工学院参考教材、豆瓣评分 8.5 的经典数据库入门书《SQL必知必会(第四版)》、日本资深数据库工程师写给初学者的入门与实战指南《SQL基础教程(第2版)》和《SQL进阶教程》。这些书的任意一本都能帮你用最快的速度与 SQL 熟络起来。

不知道小伙伴有没有这样的困扰。了解 SQL 查询语言的基本原理,但仍感觉无法自由运用 SQL?那如果你是一位数据库从业人员,只会粗浅地使用 SQL,是不行的。你必须要了解到其强大的数据处理能力才能应对大规模的数据。那今天给大家介绍的这本新书即将会告诉你 SQL 真正能帮你做些什么。

它就像是一本菜谱,包含了一系列常见的 SQL 问题及其解决方案。当你遇到一个不好解决的 SQL 问题时,翻开它,你很可能会找到解决思路,或至少得到一些启发。这是一本经典图书,名字叫做《SQL经典实例》,原版亚马逊其他数据库榜首图书,全 5 星好评。

最近,本书的中文版已经在图灵上市。确切地说这本书此前清华大学出版社曾经出版过,但早已绝版。鉴于内容经典,图灵决定重新翻译上市。

SQL Cookbook

作者:Anthony Molinaro

译者:刘春辉

  • 原版亚马逊其他数据库榜首图书

  • 长达九年的一线 SQL 开发经验总结

  • 系统讲解数据库操作,通过大量实例全面讲解 SQL


本书详细介绍了各种数据库的 SQL 查询技术和一些基础的 SQL 查询语句,并且通过实例操作的方式讲解了如何插入、更新和删除数据等相关知识。另外,本书还介绍了如何使用 SQL 语句进行日期处理,以及一些其他的 SQL 语句查询操作,能够帮助你掌握相关的 SQL 知识。

作译者简介

安东尼•莫利纳罗(Anthony Molinaro),专精SQL技术,擅长解决棘手的SQL问题,对关系理论有深入研究。

刘春辉,程序员、DBA。入行十余年,起先从事企业软件系统研发,后转入互联网行业做数据库运维,专注于数据密集型应用系统的数据库后端设计、实现、运维以及系统改善等工作。对于开源数据库以及中间件有强烈兴趣。


前边也有说过,因为这本书内容很经典,所以图灵将它重新翻译后出版。有读者担心内容是否会过时,亦或是这本书究竟能为我解决什么问题?以下是来自本书译者的一些话,相信看过之后你会对这本书有一个很全面的了解。至于你是否选它取决于你是否用得到它,对于不想读实例,只想多看看入门技巧的读者,相信文前推荐的 3 本会更适合你。

译者的话

中文版翻译是基于 SQL Cookbook 英文版的一份 PDF 文件展开的。英文版的出版时间是 2009 年 2 月,可以在这里看到:

http://shop.oreilly.com/product/9780596009762.do。

个人认为这本书的内容并不过时,书中给出的查询语句和问题解决思路并不会随着时间消逝而减分。虽然成书时各关系数据库产品的版本距离现在已经较为久远了,但其后续版本在 SQL 语法上其实变化不大。这是因为主流数据库在基本的 SQL 实现方面早已趋同,在一些 SQL 新特性上又有选择地固守各自的特色(出于各种原因,大家并不会唯 SQL 标准马首是瞻)。因此,至少十多年前 SQL 标准契合程度方面就不再是竞争焦点了。

本书特点之一是作者特别擅长利用一些 SQL 新特性构造出一个个新颖的查询解决方案。书中关于窗口函数的示例尤其精彩,读来令人耳目一新。作者在书中反复强调,读者不应固守"传统的 SQL 语法",新的 SQL 特性可以让许多问题的解决事半功倍。SQL-92 标准奠定了主流关系数据库 SQL 语法的基础,后面的几个版本陆续增加了若干新特性,诸如正则表达式、CTE 和窗口函数。不过,这些新特性的普及程度可能是个问题。从我个人经验而言,大多数工程师的 SQL 知识可能一直停留在 SQL-92 阶段,较少看到有人会在 SQL 里用到正则表达式和窗口函数。

如果读者在工作中经常写复杂的 SQL 查询,这本书提供的实例尤其会有帮助. 我认识很多从事数据分析工作的同学,他们要经常会写复杂的 SQL;也曾做过多年企业业务系统开发,工作中因为不可避免要实现许多数据报表逻辑,因此也写过很多复杂的 SQL 查询。即使你在用诸如 Hive 和 SparkSQL 这样的大数据查询系统,这本书里介绍的一些查询技巧和解题思路相信也会有参考价值。因为 SQL 是数据库世界的通用语言,大多数新型数据库在实现 SQL 支持时都会尽量向现有 SQL 标准或者主流关系数据库产品领域业已存在的事实标准靠拢。

本书的附录 A 令我印象深刻。作者用了 20 多页篇幅对窗口函数的基本概念和用法做了一次言简意赅的介绍。从个人经验而言,这篇附录大概算得上关于窗口函数最为精炼的入门材料了。最新的 MySQL 版本 (8.0) 终于在上一年 (2017年) 开始支持一部分窗口函数语法了。几周前我一时兴起,尝试把附录 A 的示例数据和 SQL 查询都一一搬到 MySQL 8.0.11 上运行了一下,很惊奇地发现所有查询不经任何修改即可正确运行。作者写作附录 A 时是基于 Oracle 数据库的,没想到多年后这些代码在 MySQL 上也能完整跑起来。


内容详情

第 1 章,介绍非常基本的查询语句。示例包括如何使用 WHERE 子句筛选结果集,为结果集里的列取别名,通过内嵌视图实现别名列引用,使用简单的条件逻辑,限制单个查询返回的记录行数,随机返回记录行,以及检索 Null 值。大多数示例都非常简单,但部分示例会再次出现在后续较为复杂的实例里。如果你是 SQL 新手或者对这些用法不太熟悉,那么应该好好读一读这一章的内容。

第 2 章,提供了一些查询结果排序的实例。这一章介绍了 ORDER BY 子句,并将其用于查询结果排序。示例的难度逐步增加,从简单的单列排序到按照子字符串排序,再到按照条件表达式排序。

第 3 章,通过一些实例来演示如何合并多个表的数据。如果你是 SQL 新手或不熟悉连接查询,我强烈建议你在阅读第 5 章及后续章节之前先读一读这一章的内容。连接查询几乎就是 SQL 的全部内容,要学会 SQL,你必须理解连接查询。这一章的示例包括执行内连接和外连接,识别笛卡儿积,执行基本的集合操作(差集、并集、交集),以及在连接查询中使用聚合函数。

第 4 章,分别提供了一些关于插入、更新和删除数据的实例。它们中的大多数都很直截了当(甚至可能让你觉得乏味)。然而,有一些操作可能对你非常有用,比如把一个表的若干行插入另一个表,更新数据时使用关联子查询,理解 Null 值的作用,以及掌握多表插入和 MERGE 命令等特性的用法。

第 5 章,通过一些实例讲解如何获取数据库的元数据信息。找出一个数据库的索引、约束和表往往非常有用。这些简单的例子帮助你获取关于数据库模式的信息。除此之外,这一章也包括一些动态 SQL 示例,例如用 SQL 生成新的 SQL。

第 6 章,介绍了一些处理字符串的实例。SQL 的字符串解析能力并不出众,但基于数据库的大量专有函数,再加上一点点创意(通常要用到笛卡儿积),你就能完成不少工作。其中一些更加有趣的例子包括计算一个字符在某个字符串里出现过多少次,基于表的若干行生成列表,把列表和字符串转换成行数据,以及从一个字母和数字混合的字符串里提取数值和字符。

第 7 章,给出了一些常见的数字运算实例。这些例子极具通用性,并且能让你体会到窗口函数在解决涉及动态计算和聚合的问题时有多方便。这一章的示例包括计算累加值;计算平均数、中位数和众数;计算百分比;在聚合运算中排除 Null值。

第 8 章,是涉及日期处理的两章中的第 1 章。对于日常任务来说,处理简单的日期运算十分重要。这一章给出的示例包括计算两个日期之间有多少个工作日,以不同的时间单位(天、月、年等)算出两个日期的差值,以及统计一年中有多少个星期一。

第 9 章,是涉及日期处理的第 2 章。你会发现日常工作中最为常见的日期操作实例,包括返回一年包含的所有天,计算闰年,算出一个月的第一天和最后一天,生成日历,以及填补一个日期范围里缺失的日期。

第 10 章,通过一些实例演示如何识别指定范围内的值,以及如何创建一系列的值。示例包括自动生成一系列行数据,填补一个数值范围里缺失的值,查找一个范围的开始值和结束值,以及查找连续的值。

第 11 章,这章中的例子有时被开发人员忽视,但对于日常开发工作来说至关重要。这些例子绝不比其他例子更难,但我却见到许多开发人员用非常低效的做法来解决同样的问题。这一章的示例包括查找“骑士值”,为结果集分页,跳过表里的某些行,逆序查找,检索靠前的 n 行,以及为查询结果排序。

第 12 章,提供了一些数据仓储和复杂报表生成领域常见的查询。我最初的愿望就是把这一章的内容作为本书的主体部分。这一章的示例包括行列互换(交叉报表),创建数据分组,创建直方图,计算出简单而完整的小计值,在一个动态的行数据窗口之上执行聚合计算,以及基于给定的时间单位做行数据分组。

第 13 章,介绍了一些与层次化有关的实例。无论采用何种建模方式,你总会在某个时刻需要做数据格式化工作,比如以树形结构或者父子关系形式展现出来。这一章提供的例子能够帮你完成这些任务。利用传统的 SQL 创建树形结构的数据集并不容易,所以数据库厂商提供的专有函数在这一章里显得尤其有用。示例包括呈现数据的父子关系,从根节点到叶子节点逐层遍历,以及构造一个层次结构。

第 14 章,各种实例的大杂烩,它们很难被归入某个问题领域,却既有趣又有用。这一章不同于其他各章之处在于,它只聚焦于数据库厂商提供的专有特性。每个实例只针对一种数据库而设,这是全书唯一这么做的一章。有两个原因促使我这么做:第一,我想让这一章的内容既有趣又带些许极客风格;第二,有些实例的存在就是为了突出某个数据库厂商的专有函数,因为在其他关系数据库管理系统里没有等价实现(示例包括 SQL Server 的 PIVOT/UNPIVOT 操作符和 Oracle 的 MODEL 子句)。在某些情况下,你能简单地改造一下这一章提供的解决方案,将其用于另一种数据库。

附录 A,带你复习窗口函数的相关知识,并且详细讨论了 SQL 分组查询。你可能不熟悉窗口函数,附录 A 可以帮助你快速入门。此外,根据我的经验,GROUP BY 查询的使用一直令许多开发人员感到迷惑。附录 A 精确定义了何为 SQL 分组查询,并且给出了多种查询示例,以进一步解释该定义。接着,附录 A 讨论了 Null 值对分组、聚合以及分区的影响,最后讨论了窗口函数中更难理解却功能强大的 OVER 子句(即开窗子句)。

附录 B,主要是向 David Rozenshtein 致敬,并把我在 SQL 开发方面的成就归功于他。Rozenshtein 的作品 The Essence of SQL 是我在课堂之外买的第一本 SQL 书。我当时买这本书,并非为了应付考试。正是这本书教会了我如何用 SQL 思考。时至今日,我仍把自己关于 SQL 工作原理的许多心得体会归功于这本书。与我读过的其他 SQL 书相比,它是如此与众不同,我为它能成为我的第一本 SQL 书而充满感激之情。我在附录 B 中重新审视了 The Essence of SQL 里出现过的一些查询语句,并给出了使用窗口函数实现的新解决方案。(在 The Essence of SQL 出版时,窗口函数尚未出现。)

目录

第1章 检索记录  1

1.1 检索所有行和列  1

1.2 筛选行  2

1.3 查找满足多个查询条件的行  2

1.4 筛选列  3

1.5 创建有意义的列名  3

1.6 在WHERE 子句中引用别名列  4

1.7 串联多列的值  5

1.8 在SELECT语句里使用条件逻辑  6

1.9 限定返回行数  6

1.10 随机返回若干行记录  8

1.11 查找Null值  9

1.12 把Null值转换为实际值  10

1.13 查找匹配项  10

第2章 查询结果排序  12

2.1 以指定顺序返回查询结果  12

2.2 多字段排序  13

2.3 依据子串排序  14

2.4 对含有字母和数字的列排序  15

2.5 排序时对Null值的处理  17

2.6 依据条件逻辑动态调整排序项  23

第3章 多表查询  25

3.1 叠加两个行集  25

3.2 合并相关行  27

3.3 查找两个表中相同的行  28

3.4 查找只存在于一个表中的数据  30

3.5 从一个表检索与另一个表不相关的行  33

3.6 新增连接查询而不影响其他连接查询  34

3.7 确定两个表是否有相同的数据  36

3.8 识别并消除笛卡儿积  42

3.9 组合使用连接查询与聚合函数  

3.9 组合使用连接查询与聚合函数  44

3.10 组合使用外连接查询与聚合函数  48

3.11 从多个表中返回缺失值  51

3.12 在运算和比较中使用Null  54

第4章 插入、更新和删除  56

4.1 插入新记录  57

4.2 插入默认值  57

4.3 使用Null覆盖默认值  58

4.4 复制数据到另一个表  59

4.5 复制表定义  59

4.6 多表插入  60

4.7 禁止插入特定列  62

4.8 更新记录  63

4.9 当相关行存在时更新记录  64

4.10 使用另一个表的数据更新记录

4.11 合并记录  67

4.12 删除全表记录  69

4.13 删除指定记录  69

4.14 删除单行记录  69

4.15 删除违反参照完整性的记录  70

4.16 删除重复记录  70

4.17 删除被其他表参照的记录  72

第5章 元数据查询  74

5.1 列举模式中的表  74

5.2 列举字段  75

5.3 列举索引列  76

5.4 列举约束  77

5.5 列举非索引外键  78

5.6 用SQL生成SQL  81

5.7 描述Oracle数据字典视图  83

第6章 字符串处理  85

6.1 遍历字符串  85

6.2 嵌入引号  87

6.3 统计字符出现的次数  88

6.4 删除不想要的字符  89

6.5 分离数字和字符数据  91

6.6 判断含有字母和数字的字符串  94

6.7 提取姓名的首字母  99

6.8 按照子字符串排序  102

6.9 根据字符串里的数字排序  103

6.10 创建分隔列表  109

6.11 分隔数据转换为多值IN列表  114

6.12 按字母表顺序排列字符  119

6.13 识别字符串里的数字字符  124

6.14 提取第n个分隔子字符串  130

6.15 解析IP地址  136

第7章 数值处理  139

7.1 计算平均值  139

7.2 查找最小值和最大值  141

7.3 求和  142

7.4 计算行数  144

7.5 计算非Null值的个数  146

7.6 累计求和  146

7.7 计算累计乘积  149

7.8 计算累计差  151

7.9 计算众数  152

7.10 计算中位数  155

7.11 计算百分比  158

7.12 聚合Null列  160

7.13 计算平均值时去掉最大值和最小值  161

7.14 将含有字母和数字的字符串转换为数字  163

7.15 修改累计值  165

第8章 日期运算  168

8.1 年月日加减法  168

8.2 计算两个日期之间的天数  170

8.3 计算两个日期之间的工作日天数  172

8.4 计算两个日期之间相差的月份和年份  176

8.5 计算两个日期之间相差的秒数、分钟数和小时数  178

8.6 统计一年中有多少个星期一  180

8.7 计算当前记录和下一条记录之间的日期差  191

第9章 日期处理  196

9.1 判断闰年  196

9.2 计算一年有多少天  203

9.3 从给定日期值里提取年月日时分秒  205

9.4 计算一个月的第一天和最后一天  207

9.5 列出一年中所有的星期五  209

9.6 找出当前月份的第一个和最后一个星期一  216

9.7 生成日历  222

9.8   列出一年中每个季度的开始日期和结束日期  239

9.9 计算一个季度的开始日期和结束日期  243

9.10 填补缺失的日期  249

9.11 依据特定时间单位检索  

数据  258

9.12 比较特定的日期要素  259

9.13 识别重叠的日期区间  262

第10章 区间查询  268

10.1 定位连续的值区间  268

10.2 计算同一组或分区的行之间的差  273

10.3 定位连续值区间的开始值和结束值  281

10.4 为值区间填充缺失值  285

10.5 生成连续的数值  289

第11章 高级查询  293

11.1 结果集分页  293

11.2 跳过n行记录  296

11.3 在外连接查询里使用OR逻辑  298

11.4 识别互逆的记录  301

11.5 提取最靠前的n行记录  302

11.6 找出最大和最小的记录  304

11.7 查询未来的行  305

11.8 行值轮转  308

11.9 对结果排序  311

11.10 删除重复项  312

11.11 查找骑士值  314

11.12 生成简单的预测  321

第12章 报表和数据仓库  329

12.1 变换结果集成一行  329

12.2 变换结果集成多行  331

12.3 反向变换结果集  339

12.4 反向变换结果集成一列  340

12.5 删除重复数据  343

12.6 变换结果集以实现跨行计算  346

12.7 创建固定大小的数据桶  347

12.8 创建预定数目的桶  351

12.9 创建水平直方图  355

12.10 创建垂直直方图  357

12.11 返回非分组列  360

12.12 计算简单的小计  365

12.13 计算所有可能的表达式组合的小计  368

12.14 识别非小计行  377

12.15 使用CASE表达式标记行数据  379

12.16 创建稀疏矩阵  380

12.17 按照时间单位分组  382

12.18 多维度聚合运算  385

12.19 动态区间聚合运算  387

12.20 变换带有小计的结果集  394

第13章 层次查询  398

13.1 展现父子关系  399

13.2 展现祖孙关系  402

13.3 创建层次视图  407

13.4 找出给定的父节点对应的所有子节点  414

13.5 确认叶子节点、分支节点和根节点  418

第14章 杂项  426

14.1 使用SQL Server的PIVOT操作符创建交叉报表  426

14.2 使用SQL Server的UNPIVOT操作符逆向转换交叉报表  428

14.3 使用Oracle的MODEL子句变换结果集  430

14.4 从不固定位置提取字符串的元素  433

14.5 计算一年有多少天  436

14.6 查找含有数字和字母的字符串  437

14.7 在Oracle中把整数转  

换成二进制  439

14.8 变换已排名的结果集  442

14.9 为两次变换后的结果集增加列标题  445

14.10 在Oracle中把标量子查询转换为复合子查询  456

14.11 解析串行化的数据  458

14.12 计算比重  462

14.13 从Oracle中生成CSV格式的输出  464

14.14 找出不匹配某个格式的文本  469

14.15 使用内嵌视图转换数据  471

14.16 测试一组数据中是否存在某个值  472

附录A 窗口函数简介  476

附录B 重温Rozenshtein  500





扫一扫,京东购

扫一扫,当当购

扫一扫,亚马逊购

文末福利

本期送出 5 本《SQL经典实例》,留言说说你平时都用 SQL 做些什么?或者说说你遇过哪些有关 SQL 的坑?总之,有关 SQL 的一切你都可以畅所欲言。截止 2018.7.23 17:00。

另外,《未来世界的幸存者》纸质版和电子版已经跟各位读者见面了,出于对这本书的喜爱,我们正在准备为它制作有声书,只是还没有找到契合的声音。如果你觉得自己合适,欢迎向我们投递录音小样:
1、内容选择:请选用《世界会走向哪里》
2、时长:5分钟即可。
3、投递邮箱:yangf@turingbook.com

☟ 点击【阅读原文】查看数据库书单

登录查看更多
4

相关内容

SQL 全名是结构化查询语言,是用于数据库中的标准数据查询语言,IBM 公司最早使用在其开发的数据库系统中。
【2020新书】从Excel中学习数据挖掘,223页pdf
专知会员服务
90+阅读 · 2020年6月28日
【2020新书】使用高级C# 提升你的编程技能,412页pdf
专知会员服务
57+阅读 · 2020年6月26日
【Manning新书】现代Java实战,592页pdf
专知会员服务
99+阅读 · 2020年5月22日
【经典书】数据结构与算法C++,第二版,738页pdf
专知会员服务
166+阅读 · 2020年3月27日
图神经网络表达能力的研究综述,41页pdf
专知会员服务
169+阅读 · 2020年3月10日
【新书】Python中的经典计算机科学问题,224页pdf
专知会员服务
144+阅读 · 2019年12月28日
如何快速入门TensorFlow ?丨极客时间
InfoQ
4+阅读 · 2019年1月8日
各编程领域最好的入门书籍
程序猿
27+阅读 · 2018年7月29日
Python 杠上 Java、C/C++,赢面有几成?
CSDN
6+阅读 · 2018年4月12日
荐书丨Python数据分析从入门到精通
程序人生
18+阅读 · 2018年3月31日
Python为啥这么牛?
Python程序员
3+阅读 · 2018年3月30日
福利 | 当Python遇上大数据与机器学习,入门so easy!
Python 书单:从入门到……
Linux中国
39+阅读 · 2017年8月6日
Arxiv
8+阅读 · 2019年5月20日
Learning to Focus when Ranking Answers
Arxiv
5+阅读 · 2018年8月8日
Bidirectional Attention for SQL Generation
Arxiv
4+阅读 · 2018年6月21日
Arxiv
5+阅读 · 2018年5月1日
Arxiv
14+阅读 · 2018年4月18日
VIP会员
相关VIP内容
【2020新书】从Excel中学习数据挖掘,223页pdf
专知会员服务
90+阅读 · 2020年6月28日
【2020新书】使用高级C# 提升你的编程技能,412页pdf
专知会员服务
57+阅读 · 2020年6月26日
【Manning新书】现代Java实战,592页pdf
专知会员服务
99+阅读 · 2020年5月22日
【经典书】数据结构与算法C++,第二版,738页pdf
专知会员服务
166+阅读 · 2020年3月27日
图神经网络表达能力的研究综述,41页pdf
专知会员服务
169+阅读 · 2020年3月10日
【新书】Python中的经典计算机科学问题,224页pdf
专知会员服务
144+阅读 · 2019年12月28日
相关资讯
如何快速入门TensorFlow ?丨极客时间
InfoQ
4+阅读 · 2019年1月8日
各编程领域最好的入门书籍
程序猿
27+阅读 · 2018年7月29日
Python 杠上 Java、C/C++,赢面有几成?
CSDN
6+阅读 · 2018年4月12日
荐书丨Python数据分析从入门到精通
程序人生
18+阅读 · 2018年3月31日
Python为啥这么牛?
Python程序员
3+阅读 · 2018年3月30日
福利 | 当Python遇上大数据与机器学习,入门so easy!
Python 书单:从入门到……
Linux中国
39+阅读 · 2017年8月6日
相关论文
Top
微信扫码咨询专知VIP会员