SQL 进阶教程

内容简介

本书是《SQL 基础教程》做者 MICK 为志在向中级进阶的数据库工程师编写的一本 SQL 技能提高指南。html

全书可分为两部分,第一部分介绍了 SQL 语言不一样寻常的使用技巧,带领读者从 SQL 常见技术,好比 CASE 表达式、自链接、HAVING 子句、外链接、关联子查询、EXISTS……去探索新发现。这部分不只穿插讲解了这些技巧背后的逻辑和相关知识,并且辅以丰富的示例程序,旨在帮助读者提高编程水平;第二部分着重介绍关系数据库的发展史,把实践与理论结合起来,旨在帮助读者加深对关系数据库和 SQL 语言的理解。此外,每节末尾均设置有练习题,并在书末提供了解答,方便读者检验本身对书中知识点的掌握程度。git

本书适合具备半年以上 SQL 使用经验、已掌握 SQL 基础知识和技能、但愿提高本身编程水平的读者阅读。数据库

本书特点

  1. 转变面向过程语言的思惟定式,学习 SQL 常见技术的不一样用法,切实提高 SQL 应用技能。
  2. 解析经典文献,回顾关系数据库发展史,从逻辑学、集合论的角度讲述 SQL 和关系模型的理论,深入理解面向集合思惟。
  3. 讲解由浅入深,辅以200多段基于标准 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 水平的读者阅读。在翻译过程当中,我尽力表达出原著的意图,可是因为水平有限,不免存在问题,欢迎读者批评指正。读者在阅读中有任何问题,均可以经过电子邮件和我取得联系(ensho_go@hotmail.com)。设计

2017 年 9 月

于北京

前言

编写本书的目的在于架起两座桥梁:一是让数据库工程师从初级向中级进阶的桥梁,旨在帮助初级工程师提高本身;二是理论(原理)和实践之间的桥梁。这里所说的“初级”,具体是指已经掌握了 SQL 的基础知识和技能,具备半年到一年左右的使用经验这种水平。

咱们来作一个测试,帮助你们了解一下本身处于何种水平。下面有10个问题,请回答 Yes 或 No。

  1. 没有在聚合函数中使用过 CASE 表达式。

  2. 想象不出自链接是如何工做的。

  3. 感受 HAVING 子句不是很经常使用。

  4. 感受 INEXISTS 好用,因此更喜欢用 IN

  5. 听到布尔类型,脑海里浮现出的只有 truefalse

  6. 设计表的时候不加 NOT NULL 的约束。

  7. SQL 所有用大写字母或所有用小写字母来写。

  8. 不能用一句话说出 GROUP BYPARTITION BY 的区别。

  9. 不知道 SQL 里的高阶函数的名字。

  10. 试着读过 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 数据库中出错(其余数据库里也同样,省略了就不会出错)。

  • RANKROW_NUMBER 这样的窗口函数(OLAP 函数)目前还不能在 MySQL 数据库中运行。

  • 正文里的代码在如下数据库中测试运行过。

    • Oracle 10g
    • SQL Server 2005
    • DB2 9.1
    • PostgreSQL 9.6
    • MySQL 5.0
  • 正文里提到 Oracle、MySQL 等数据库而未指定版本时,请参照上述版本。

  • 关于用于建立示例用表的 SQL 语句和示例代码等,请参考以下网站。

    http://www.ituring.com.cn/book/1813(请点击“随书下载”下载中文版相关资料)

    http://www.geocities.jp/mickindex/database/db_support_sinan.html(做者 MICK 的日文网站)

1-1 CASE 表达式
1-2 自链接的用法
1-3 三值逻辑和 NULL
1-4 HAVING 子句的力量
1-5 外链接的用法
1-6 用关联子查询比较行与行
1-7 用 SQL 进行集合运算
1-8 EXISTS 谓词的用法
1-9 用 SQL 处理数列
1-10 HAVING 子句又回来了
1-11 让 SQL 飞起来
1-12 SQL 编程方法
2-1 关系数据库的历史
2-2 为何叫“关系”模型
2-3 开始于关系,结束于关系
2-4 地址这一巨大的怪物
2-5 GROUP BY 和 PARTITION BY
2-6 从面向过程思惟向声明式思惟、面向集合思惟转变的7个关键点
2-7 SQL 和递归集合
2-8 人类的逻辑学
2-9 消灭 NULL 委员会
2-10 SQL 中的层级
3-1 习题解答
3-2 参考文献
后记

阅读全文: http://gitbook.cn/gitchat/geekbook/5c04b2d4b4075a37edf1522a