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 出版时,窗口函数尚未出现。)
扫一扫,京东购
扫一扫,当当购
扫一扫,亚马逊购
文末福利
本期送出 5 本《SQL经典实例》,留言说说你平时都用 SQL 做些什么?或者说说你遇过哪些有关 SQL 的坑?总之,有关 SQL 的一切你都可以畅所欲言。截止 2018.7.23 17:00。
另外,《未来世界的幸存者》纸质版和电子版已经跟各位读者见面了,出于对这本书的喜爱,我们正在准备为它制作有声书,只是还没有找到契合的声音。如果你觉得自己合适,欢迎向我们投递录音小样:
1、内容选择:请选用《世界会走向哪里》
2、时长:5分钟即可。
3、投递邮箱:yangf@turingbook.com
☟ 点击【阅读原文】查看数据库书单