本书是《SQL 基础教程》作者 MICK 为志在向中级进阶的数据库工程师编写的一本 SQL 技能提升指南。
全书可分为两部分,第一部分介绍了 SQL 语言不同寻常的使用技巧,带领读者从 SQL 常见技术,比如 CASE 表达式、自连接、HAVING 子句、外连接、关联子查询、EXISTS……去探索新发现。这部分不仅穿插讲解了这些技巧背后的逻辑和相关知识,而且辅以丰富的示例程序,旨在帮助读者提升编程水平;第二部分着重介绍关系数据库的发展史,把实践与理论结合起来,旨在帮助读者加深对关系数据库和 SQL 语言的理解。此外,每节末尾均设置有练习题,并在书末提供了解答,方便读者检验自己对书中知识点的掌握程度。
本书适合具有半年以上 SQL 使用经验、已掌握 SQL 基础知识和技能、希望提升自己编程水平的读者阅读。
MICK,日本知名数据库工程师,就职于 SI 企业,致力于数据仓库和商业智能的开发。日常除了在其个人主页“关系数据库的世界”中分享数据库和 SQL 的相关技术信息外,还为 CodeZine(http://codezine.jp)及 IT 技术杂志 WEB+DB PRESS 撰写相关技术文章。同时还是《SQL 解惑(第2版)》日文版的译者。
我曾在日本从事多年软件开发工作,工作中经常会跟各种数据库打交道,编写 SQL 代码也是常有的事情。但是对于 SQL 语言,当时也只是通过大学里的一门讲授数据库系统的课程了解了基本的语法,在工作中积累了一些实用的经验而已,并没有进行过非常深入的研究。于是我便打算找一本深入一些的书,最好是面向有一定编程经验的读者的,系统地学习一下。
后来我在书店遇见了 MICK 先生的这本书,翻看前言,尝试了他提出的检验读者水平的若干问题。非常遗憾,我只能回答出很少的几个,于是我便认为这本书正是我需要的,当场决定买下了。
几年过去,我由于个人原因回国了,工作中也不再使用日语,便想着借着业余时间翻译一些优秀的日语技术书。当图灵公司的老师问我是否有意向翻译这本书时,我立刻就答应了。当初回国时为了缩减行李,我只保留了几本日语原版的技术书,这本就是其中之一。这样一本多年前结缘、至今仍躺在我书架上的好书,当有机会将它翻译成中文版时,我实在没有什么理由放弃掉。
这本书,我认为是作者的用心之作。书中大部分内容都来自作者记录自己实践总结和日常思考的个人博客,最大的特点是理论与实践相结合,除了讲述应该怎么做,还解释了其背后的原理。全书包含两部分内容,第一部分介绍了 SQL 在使用方面的一些技巧,第二部分介绍了关系数据库相关的内容。第一部分在介绍 SQL 的技巧时,作者并没有上来就展示各种酷炫的招式,而是先以简单的问题或者例题引出将要讨论的内容,在讲解之后进一步扩展,由点及面地引出更深的话题或者背后的原理。这种由浅入深的讲述方式,符合一般的学习习惯,读者能在轻松愉悦的阅读过程中,跟着作者一起思考,自然而然地掌握相应的思考方式。第二部分在介绍关系数据库时,作者先介绍了关系数据库诞生的历史背景及其解决的问题。关系数据库已经诞生了几十年,为了让现在的读者理解当初的问题和背景,作者大量引用了关系数据库之父 E.F. Codd 和关系数据库领域权威专家 C.J. Date 的文献和言论,并按自己的理解给出了分析与解释,力图使读者体会到伟大人物们在革新技术之际的心路历程。除此之外,第二部分中作者还从逻辑学和集合论的角度讲述了 SQL 和关系模型的理论基础。该部分内容作者充分发挥了自己在相关领域的深厚积累,以深入浅出的方式进行了阐述,我认为非常精彩。
书中引用了许多经典的图书和文献,都在脚注和书末参考文献中给出了详细的出处,方便有需要的读者进一步研读。更加可贵的是,在大多数小节的末尾作者都提出了两三个精心设计的小问题,这些问题是正文内容的扩展和延伸,非常利于读者巩固相应的知识点。而且,针对这些问题,作者也给出了详细的解答,并指出了读者容易犯的错误。
本书推荐数据库工程师、经常需要和数据库打交道的软件工程师,以及所有希望提升 SQL 水平的读者阅读。在翻译过程中,我尽力表达出原著的意图,但是由于水平有限,难免存在问题,欢迎读者批评指正。读者在阅读中有任何问题,都可以通过电子邮件和我取得联系([email protected])。
2017 年 9 月
于北京
编写本书的目的在于架起两座桥梁:一是让数据库工程师从初级向中级进阶的桥梁,旨在帮助初级工程师提升自己;二是理论(原理)和实践之间的桥梁。这里所说的“初级”,具体是指已经掌握了 SQL 的基础知识和技能,具有半年到一年左右的使用经验这种水平。
我们来做一个测试,帮助大家了解一下自己处于何种水平。下面有10个问题,请回答 Yes 或 No。
没有在聚合函数中使用过 CASE
表达式。
想象不出自连接是如何工作的。
感觉 HAVING
子句不是很常用。
感觉 IN
比 EXISTS
好用,所以更喜欢用 IN
。
听到布尔类型,脑海里浮现出的只有 true
和 false
。
设计表的时候不加 NOT NULL
的约束。
SQL 全部用大写字母或全部用小写字母来写。
不能用一句话说出 GROUP BY
和 PARTITION BY
的区别。
不知道 SQL 里的高阶函数的名字。
试着读过 Joe Celko 的《SQL 权威指南》[1]和《SQL 解惑(第2版)》[2],但是感觉太难而没能读完(或者压根儿没有读过)。
大家的回答如何呢?如果全部都回答了 No,那很好,不要担心什么,请合上本书,立刻踏上成为一名高级工程师的道路吧(也许只有本书3-2节“参考文献”值得略读一下)。相反,如果一半以上都回答了 Yes,那么本书将照亮大家的前进之路——这正是编写本书的目的,相信大家读后一定会有收获。
但是,接下来要说的内容可能会让大家觉得有点前后矛盾。因为,这本书即将介绍的技术绝不是多么新潮的东西,而是遵循标准 SQL 的非常普通的技术。关于这一点,相信扫一眼目录你就会明白。CASE
表达式、自连接、HAVING
子句、外连接、关联子查询、EXISTS……
这些都是数据库工程师日常工作中经常用到的技术。
编写本书的目的就是从新的角度把光照向这些“并没有什么特别的、谁都知道的技术”,照亮它们迄今都没有被看到的一面。相信大家读完本书时,会从那个一直以来都被认为平淡无奇的关系数据库的世界里,看到一些不一样的光辉。
下面,就让我们立刻前往博大精深的关系数据库的世界,开始探险之旅吧。
声明
本书中的 URL 等信息可能会有变化。
本书出版之际,我们力求准确阐述,但是翔泳社、原书作者、人民邮电出版社和译者均不对内容作任何保证,对于由本书内容和示例代码造成的一切后果,不承担任何责任。
本书中的示例代码和脚本,以及执行结果页面都是基于特定环境的参考示例。
本书中的公司名、商品名分别是相关公司的商标或注册商标。
[1] 原书名为 Joe Celko's SQL for Smarties: Advanced SQL Programming,本书共有五版。国内引进了第4版,书名为《SQL 权威指南(第4版)》,朱巍等译,人民邮电出版社,2013年。——编者注
[2] 米全喜译,人民邮电出版社,2008年4月。——编者注
本书中出现的 SQL 语句都是尽可能按照标准 SQL(SQL-92/99/2003)来写的,对于依赖具体数据库实现的地方,本书会有明确的说明。
按照标准 SQL 的要求,指定表的别名的关键字 AS 也应该写上,但本书省略了。这是为了避免 SQL 程序在 Oracle 数据库中出错(其他数据库里也一样,省略了就不会出错)。
RANK
、ROW_NUMBER
这样的窗口函数(OLAP 函数)目前还不能在 MySQL 数据库中运行。
正文里的代码在以下数据库中测试运行过。
正文里提到 Oracle、MySQL 等数据库而未指定版本时,请参照上述版本。
关于用于创建示例用表的 SQL 语句和示例代码等,请参考如下网站。
http://www.ituring.com.cn/book/1813(请点击“随书下载”下载中文版相关资料)
http://www.geocities.jp/mickindex/database/db_support_sinan.html(作者 MICK 的日文网站)
阅读全文: http://gitbook.cn/gitchat/geekbook/5c04b2d4b4075a37edf1522a