SQL 基础教程(第2版)
前言
本书面向完全没有编程和系统开发经验的初学者,介绍了关系数据库以及用来操作关系数据库的 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.sqlList 1_4_Oracle.sqlList 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是如何从数据库中获取数据的呢
- 执行连接数据库的程序
- 选取表中的数据
- 更新表中的数据
- 小结