SQL 基础教程(第2版)

《SQL 基础教程(第2版)》封面

ゼロからはじめるデータベース操作

✍️ 作者 日/MICK
🗣️ 译者
📅 出版 2017-06-01
🌐 语言 zh-Hans
📄 页数 336页
🔢 ISBN 9787115455024
🏢 出版社 人民邮电出版社
📚 分类 T工业技术/TP自动化技术、计算机技术/TP311.138
⭐ 评分 9.1 ★★★★☆

前言

本书面向完全没有编程和系统开发经验的初学者,介绍了关系数据库以及用来操作关系数据库的 SQL 语言的使用方法。各个章节结合具体示例进行解说,并在每章的结尾安排了习题,用来检验读者对该章内容的理解程度。大家可以从第 1 章开始,亲自验证示例程序,循序渐进地掌握 SQL 的基础知识和技巧。另外,本书还将重要知识点总结为法则,方便读者在学习完本书之后随时查阅。

近年来,和其他系统领域一样,数据库领域也实现了飞速发展,应用范围不断扩大,不但出现了具有新功能的数据库,而且操作的数据量也大幅增长。

本书将要介绍的关系数据库是时下最流行的数据库,也是理解其他数据库的基础。在系统领域,通常所讲的数据库指的就是关系数据库,其重要性可见一斑。

估计很多读者今后都会慢慢积累各个领域、各种规模的系统开发经验(或者可能已经开始从事开发方面的工作了),到那时,所有的系统必定都需要使用数据库。它们使用的数据库,即便不是关系数据库,也一定是以关系数据库为基础的数据库。从这个意义上看,如果掌握了关系数据库和 SQL,就能成为任何系统开发都需要的数据库专家了。

现在距离本书初版问世已经 6 年了,在这 6 年间,数据库发挥了越来越重要的作用。以前就有专家使用数据库进行统计分析,后来数据库也开始逐渐被应用到大规模数据的处理上,并引发了商业领域的变革。象征着这一变化的“大数据”“数据科学”等用语,已经突破了系统的领域,蔓延到了整个社会之中。甚至有观点认为,统计分析将和人工智能并列成为决定社会未来走向的重要因素。

一方面,数据库的世界中也进行着技术的革新。如今,以 KVS 为代表的非关系数据库的使用已经不再稀奇。同时,为了追求更高的大规模数据处理的性能,内存数据库和面向列数据库的技术也取得了长足的进步,并逐渐投入到实际应用当中。

另一方面,关系数据库依然是当今的主流数据库,这一点没有变。从这个意义上来说,学习关系数据库和操作关系数据库的语言 SQL 语句,仍然是探究数据库世界的第一步,这一点也没有变,但这并不是说关系数据库和 SQL 语句一直在止步不前。大多数 DBMS 都支持窗口函数和 GROUPING 运算符(详见第 8 章),高效处理大规模数据的功能也更加完善。掌握了 SQL 语句,就可以自由自在地操作数据,构筑高效的系统。

本书与时俱进地进行了版本升级。不但根据具有代表性的 DBMS 的新版本对 SQL 语法的支持情况更新了描述,还新增了第 9 章,介绍了通过应用程序来使用数据库的方法。

本书旨在把数据库领域的精彩展示给大家,衷心希望本书能为大家的进步提供一些帮助。

本书涉及的关系数据库

本书中使用的 SQL 语句全部都在下列关系数据库管理系统(RDBMS)中进行了验证。

  • Oracle Database 12cR1
  • SQL Server 2014
  • DB2 10.5
  • PostgreSQL 9.5.3
  • MySQL 5.7

在这 5 种 RDBMS 之间存在差异的 SQL 语句,或者只能在某种特定的 RDBMS 中使用的 SQL 语句,本书都用下列图标进行标识,来提示执行 SQL 语句所使用的 RDBMS。

Oracle  SQL Server DB2 PostgreSQL MySQL

反之,在所有 RDBMS 中都能正常执行的 SQL 语句则不用图标标识。

本书的学习安排

首先,在第 1 章前半部分学习关系数据库和 SQL 的基础知识,然后结合具体的 SQL 示例程序进行循序渐进的学习。

在 SQL 的学习中,最重要的就是以下两点:

  • 亲自编写 SQL 语句
  • 通过执行 SQL 语句来学习和理解数据库操作

要提高学习效率,需尽量亲自执行并验证本书中的示例程序,逐步深入学习。

为了便于初学者操作,本书使用 PostgreSQL 作为 SQL 语句的学习环境。在开始学习之前,读者需要先在自己的电脑上安装 PostgreSQL,准备好 SQL 语句的执行环境。关于 PostgreSQL 的安装方法、SQL 语句的执行方法等详细内容,我们会在第 0 章介绍。

如果你已经安装了上述“本书涉及的关系数据库”中的数据库,也可以直接使用。

另外,如无特殊说明,本书中出现的 SQL 语句的执行结果,都是在 PostgreSQL 9.5 中执行的结果。

关于程序下载

本书中的示例程序都可以网站下载

示例程序为压缩的 Zip 文件形式,解压后的文件结构如下所示。

├─ ReadMe.txt ........... 注意事项
├─ Answer  .......... 习题答案(示例程序)
├─ Sample  ........... 第1章到第9章的示例程序
	├── Ch01
		├── 1_4
		├── 1_5
	├── CreateTable........... 创建示例用表的SQL语句

ReadMe.txt 文件:介绍了示例程序的内容和注意事项,使用前请务必阅读该文件。

Sample 文件夹:本书中所使用的示例程序分别保存在以章节为单位的文件夹中。在 Sample\CreateTable 文件夹中,按照 RDBMS 的不同,分别保存了用来创建示例用表的 SQL 语句。

Answer 文件夹:各章末习题的答案(示例程序),分别保存在以章为单位的目录中。

关于示例程序

示例程序的文件名与书中的代码清单编号相对应。例如,1-5 节的代码清单 1-3 的示例程序,保存的位置和文件名如下所示。

├─ Sample
	├── Ch01
		├── 1_5
			├── list1_3.sql

另外,像如下代码清单这样,在不同的 RDBMS 中存在差异的 SQL 语句,会在其文件名的末尾加上 RDBMS 的名称。

代码清单 1- 4 添加一列可以存储 100 位可变长度字符串的 product_name_pinyin

ALTER TABLE Product ADD COLUMN product_name_pinyin VARCHAR (100);
ALTER TABLE Product ADD (product_name_pinyin VARCHAR (100));
ALTER TABLE Product ADD product_name_pinyin VARCHAR (100);

这种情况下,示例程序的文件名如下所示。

  • List 1_4_DB 2_PostgreSQL_MySQL.sql
  • List 1_4_Oracle.sql
  • List 1_4_SQL Server.sql

创建示例用表的 SQL 语句

创建示例用表的 SQL 语句用于创建示例用表的 SQL 文件保存在 Sample\CreateTable 文件夹中,文件名为“CreateTable 表名.sql”。例如,PostgreSQL 用到的表 Product 保存在下述目录中。

├─ Sample
	├── CreateTable
		├── PostgreSQL
			├── CreateTableProduct.sql

保存在 Sample 文件夹中的示例程序文件,可以使用 Windows 的记事本(或者其他文本编辑器)打开。

第0章 绪论——搭建 SQL 的学习环境

如果要一边执行 SQL 语句一边学习,就必须有数据库作为 SQL 语句的执行环境。本章将介绍开源数据库 PostgreSQL(版本 9.5.3)在 Windows 环境下的安装方法。已经安装了执行环境(数据库)的读者,可以跳过本章,直接学习第 1 章及之后的内容。

PostgreSQL 是 1980 年以加利福尼亚大学为中心开发出来的 DBMS,与 MySQL 一样,都是世界上广泛应用的开源数据库(DB)。它严格遵守标准 SQL 规则,是初学者的最佳选择。

PostgreSQL 的安装和连接设置

  • 安装步骤
  • 修改设置文件

通过 PostgreSQL 执行 SQL 语句

  • 连接 PostgreSQL(登录)
  • 执行 SQL 语句
  • 创建学习用的数据库
  • 连接学习用的数据库(登录)
注意

本书使用 PostgreSQL 作为 SQL 的学习环境,当然也可以使用其他关系数据库。


本书使用 Windows 10 来介绍数据库的安装方法,该方法也适用于其他 WindowsOS。

第1章 数据库和 SQL

本章介绍了数据库的结构和基本理论,以及数据库的实际应用。大家可以学习到如何对关系数据库中用来存储数据的表进行创建、更新和删除操作,同时还能掌握关系数据库专用的 SQL 语句的书写方法和规则。

数据库是什么

  • 我们身边的数据库
  • 为什么 DBMS 那么重要
  • DBMS 的种类

数据库的结构

  • RDBMS 的常见系统结构
  • 表的结构

SQL 概要

  • 标准 SQL
  • SQL 语句及其种类
  • SQL 的基本书写规则

表的创建

  • 表的内容的创建
  • 数据库的创建(CREATE DATABASE 语句)
  • 表的创建(CREATE TABLE 语句)
  • 命名规则
  • 数据类型的指定
  • 约束的设置

表的删除和更新

  • 表的删除(DROP TABLE 语句)
  • 表定义的更新(ALTER TABLE 语句)
  • 向 Product 表中插入数据

第2章 查询基础

本章将会和大家一起学习查询前一章创建的 Product 表中数据的 SQL 语句。这里使用的 SELECT 语句是 SQL 最基本也是最重要的语句。请大家在实际运行书中的 SELECT 语句时,亲身体验一下其书写方法和执行结果。

执行查询操作时可以指定想要查询数据的条件(查询条件)。查询时可以指定一个或多个查询条件,例如“某一列等于这个值”“某一列计算之后的值大于这个值”等。

SELECT 语句基础

  • 列的查询
  • 查询出表中所有的列
  • 为列设定别名
  • 常数的查询
  • 从结果中删除重复行
  • 根据 WHERE 语句来选择记录
  • 注释的书写方法

算术运算符和比较运算符

  • 算术运算符
  • 需要注意 NULL
  • 比较运算符
  • 对字符串使用不等号时的注意事项
  • 不能对 NULL 使用比较运算符

逻辑运算符

  • NOT 运算符
  • AND 运算符和 OR 运算符
  • 使用括号强化处理
  • 逻辑运算符合真值
  • 含有 NULL 时的真值

第3章 聚合与排序

随着表中记录(数据行)的不断积累,存储数据逐渐增加,有时我们可能希望计算出这些数据的合计值或者平均值等。本章我们将学习使用 SQL 语句进行汇总操作的方法。此外,我们还会学习在汇总操作时指定条件,以及对汇总结果进行升序、降序的排序方法。

对表进行聚合查询

  • 聚合函数
  • 计算表中数据的行数
  • 计算 NULL 之外的数据的行数
  • 计算合计值
  • 计算平均值
  • 计算最大值和最小值
  • 使用聚合函数删除重复值(关键字 DISTINCT)

对表进行分组

  • GROUP BY 子句
  • 聚合键中包含 NULL 的情况
  • 使用 WHERE 子句时 GROUP BY 的执行结果
  • 与聚合函数和 GROUP BY 子句有关的常见错误

为聚合结果指定条件

  • HAVING 子句
  • HAVING 子句的构成要素
  • 相对于 HAVING 子句,更适合写在 WHERE 子句中的条件

对查询结果进行排序

  • ORDER BY 子句
  • 指定升序或降序
  • 指定多个排序键
  • NULL 的顺序
  • 在排序键中使用显示用的别名
  • ORDER BY 子句中可以使用的列
  • 不要使用列编号

第4章 数据更新

此前几章和大家一起学习了查询表中数据的几种方法,所使用的 SQL 语句都是 SELECT 语句。SELECT 语句并不会更改表中数据,也就是说,SELECT 语句是读取专用的指令。

本章将会给大家介绍 DBMS 中用来更新表中数据的方法。数据的更新处理大体可以分为插入(INSERT)、删除(DELETE)和更新(UPDATE)三类。本章将会对这三类更新方法进行详细介绍。此外,还会给大家介绍数据库中用来管理数据更新的重要概念——事务。

数据的插入(INSERT 语句的使用方法)

  • 什么是 INSERT
  • INSERT 语句的基本语法
  • 列清单的省略
  • 插入 NULL
  • 插入默认值
  • 从其他表中复制数据

数据的删除(DELETE 语句的使用方法)

  • DROP TABLE 语句和 DELETE 语句
  • DELETE 语句的基本语法
  • 指定删除对象的 DELETE 语句(搜索型 DELETE)

数据的更新(UPDATE 语句的使用方法)

  • UPDATE 语句的基本语法
  • 指定条件的 UPDATE 语句(搜索型 UPDATE)
  • 使用 NULL 进行更新
  • 多列更新

事务

  • 什么是事务
  • 创建事务
  • ACID 特性

第5章 复杂查询

前几章我们一起学习了表的创建、查询和更新等数据库的基本操作方法。从本章开始,我们将会在这些基本方法的基础上,学习一些实际应用中的方法。

本章将以前学过的 SELECT 语句,以及嵌套在 SELECT 语句中的视图和子查询等技术为中心进行学习。由于视图和子查询可以像表一样进行使用,因此如果能恰当地使用这些技术,就可以写出更加灵活的 SQL 了。

视图

  • 视图和表
  • 创建视图的方法
  • 视图的限制① ——定义视图时不能使用ORDER BY子句
  • 视图的限制② ——对视图进行更新
  • 删除视图

子查询

  • 子查询和视图
  • 子查询的名称
  • 标量子查询
  • 标量子查询的书写位置
  • 使用标量子查询时的注意事项

关联子查询

  • 普通的子查询和关联子查询的区别
  • 关联子查询也是用来对集合进行切分的
  • 结合条件一定要写在子查询中

第6章 函数、谓词、CASE表达式

不仅 SQL,对所有的编程语言来说,函数都起着至关重要的作用。函数就像是编程语言的“道具箱”,每种编程语言都准备了非常多的函数。使用函数,我们可以实现计算、字符串操作、日期计算等各种各样的运算。

本章将会和大家一起学习具有代表性的函数以及特殊版本的函数(谓词和 CASE 表达式)的使用方法。

各种各样的函数

  • 函数的种类
  • 算术函数
  • 字符串函数
  • 日期函数
  • 转换函数

谓词

  • 什么是谓词
  • LIKE谓词——字符串的部分一致查询
  • BETWEEN谓词——范围查询
  • IS NULL、IS NOT NULL——判断是否为NULL
  • IN谓词——OR的简便用法
  • 使用子查询作为IN谓词的参数
  • EXIST谓词

CASE表达式

  • 什么是CASE表达式
  • CASE表达式的语法
  • CASE表达式的使用方法

第7章 集合运算

前面几章我们学习了使用一张表的 SQL 语句的书写方法,本章将会和大家一起学习使用 2 张以上的表的 SQL 语句。通过以行方向(竖)为单位的集合运算符和以列方向(横)为单位的联结,就可以将分散在多张表中的数据组合成为期望的结果。

表的加减法

  • 什么是集合运算
  • 表的加法——UNION
  • 集合运算的注意事项
  • 包含重复行的集合运算——ALL选项
  • 选取表中公共部分——INTERSECT
  • 记录的减法——EXCEPT

联结(以列为单位对表进行联结)

  • 什么是联结
  • 内联结——INNER JOIN
  • 外联结——OUTER JOIN
  • 3张以上的表的联结
  • 交叉联结——CROSS JOIN
  • 联结的特定语法和过时语法

第8章 SQL高级处理

本章将要学习的是 SQL 中的高级聚合处理。即使是“高级处理”,说到底也还是在 SQL 中能够执行的处理。从用户的角度来说,就是那些对数值进行排序,计算销售总额等我们熟悉的处理。

和自然语言一样,SQL 语言也会随着时间而不断变化,现在每隔几年就会对标准 SQL 进行功能追加和语法修正。本章将要介绍的是最近才添加的功能。掌握了这些方便的新功能,使用 SQL 能够完成的工作范围也会不断扩展。

窗口函数

  • 什么是窗口函数
  • 窗口函数的语法
  • 语法的基本使用方法——使用RANK函数
  • 无需指定PARTITION BY
  • 专用窗口函数的种类
  • 窗口函数的适用范围
  • 作为窗口函数使用的聚合函数
  • 计算移动平均
  • 两个ORDER BY

GROUPING运算符

  • 同时计算出合计值
  • ROLLUP——同时得出合计和小计
  • GROUPING函数——让NULL更加容易分辨
  • CUBE——用数据来搭积木
  • GROUPING SETS——取得期望的积木

第9章 通过应用程序连接数据库

截止到第8章,关于使用SQL语句处理数据的基础知识的学习就告一段落了。本章将会转换一下视角,带领大家了解如何通过应用程序执行SQL语句来处理数据。

本章将使用Java语言来编写应用程序连接数据库。Java是现在非常流行的应用程序开发语言。为了执行Java程序,大家需要在自己的电脑中安装Java开发工具JDK(Java Development Kit)。JDK可以从Oracle公司的网站下载,下载和安装步骤请参考“JDK下载安装手册”文件,该文件可以从以下网站下载

此外,本章假定大家已经按照第 0 章的步骤完成了PostgreSQL的安装。没有安装PostgreSQL的读者,请按照第 0 章的步骤提前安装好PostgreSQL。

数据库世界和应用程序世界的连接

  • 数据库和应用程序之间的关系
  • 驱动——两个世界之间的桥梁
  • 驱动的种类

Java基础知识

  • 第一个程序Hello,World
  • 编译和程序执行
  • 常见错误

通过Java连接PostgreSQL

  • 执行SQL语句的Java程序
  • Java是如何从数据库中获取数据的呢
  • 执行连接数据库的程序
  • 选取表中的数据
  • 更新表中的数据
  • 小结

附录 练习题答案