
本书基于作者十多年的工作经验和分享,全面覆盖了从SQL基础查询到高级分析、从数据库设计到查询优化等内容,通过循序渐进的方式和简单易懂的案例分析,透彻讲解了每个SQL知识点。本书采用了最新的SQL:2019标准,紧跟产业发展趋势,帮助读者解锁最前沿的SQL特性,同时提供了5种主流数据库的实现和差异。最后,本书还介绍了最新SQL标准对文档存储(JSON)、复杂事件处理(MATCH_RECOGNIZE)、多维数组(SQL/MDA)以及图形存储(SQL/PGQ)的支持。
数据库,尤其是关系型数据库,是现代企业存储和处理数据的主要方式。目前主流的关系 型数据库包括 MySQL、Oracle、Microsoft SQL Server、PostgreSQL 以及 SQLite 等。虽然这些 数据库系统的具体实现有所不同,但它们都使用 SQL 作为访问和操作数据库的标准语言。 SQL(Structured Query Language,结构化查询语言)作为访问和操作关系型数据库的标准 语言,不但应用广泛,而且简单易学。掌握 SQL 已经成为 IT 行业和数据分析从业者必不可少 的技能之一。在设计之初,SQL 就考虑了非技术人员的使用需求,因此 SQL 语句均由简单的英 语单词组成,主要的 SQL 语句只有几个,很多时候甚至只需使用一个 SELECT 语句。 也许正是由于它的简单易用,以致很多人都认为 SQL 只有简单的增删改查(CRUD)功能。 但实际上,早在 1999 年 SQL 就支持了通用表表达式(WITH 语句)和递归查询、用户定义类 型以及许多在线分析功能。随后它又增加了窗口函数、MERGE 语句、XML 数据类型、JSON 文档存储、复杂事件和流数据处理以及多维数组等功能。最新的 SQL 标准正在定制与图形存储 相关的功能。 虽然 SQL 是基于关系模型开发的语言,但是在经过几十年的发展之后,它早就不再局限于 关系模型了。我编写本书的目的就在于,希望能够帮助大家了解并学习现代化的 SQL 语言和编 程思想,而不仅仅局限于掌握传统 SQL 所提供的简单功能。 SQL 编程思想:基于 5 种主流数据库代码实现 本书内容 本书共 18 章以及 1 个附录。 第 1 章简单回顾了数据库和关系型数据库的基本概念、什么是 SQL 以及它的主要特性和设 计思想。 第 2 章介绍了 SELECT 语句的基本检索、数据过滤、排序显示以及限定查询结果数量等, 同时还讨论了 SQL 语句中的代码注释方法。 第 3 章介绍了如何通过 SQL 函数进行数据处理,如何利用条件表达式(CASE)实现逻辑 处理功能。 第 4 章介绍了如何利用 SQL 中的聚合函数对数据进行汇总。SQL 聚合函数通常和分组操作 (GROUP BY)一起使用,因此我们还介绍了数据的分组汇总以及汇总后的数据过滤。 第 5 章介绍了数据库中的空值(NULL)问题及其解决方法。 第 6 章介绍了如何使用连接查询(JOIN)获取多个表中的关联数据,包括两种 SQL 连接语 法以及内连接、左/右/全外连接、交叉连接、自然连接和自连接等类型。 第 7 章介绍了各种类型的子查询以及相关的运算符。 第 8 章介绍了如何使用 SQL 集合运算符,将两个或多个查询结果集组合成一个结果集。 第 9 章介绍了如何利用通用表表达式(Common Table Expression)简化复杂的子查询和连 接查询,实现树状结构数据的遍历,提高 SQL 语句的可读性和性能。 第 10 章介绍了 SQL 窗口函数的定义和参数选项,以及各类窗口函数的作用。 第 11 章介绍了数据操作语言(DML),包括数据的插入(INSERT)、更新(UPDATE)、 删除(DELETE)以及合并(MERGE)。 第 12 章介绍了数据库中事务的概念、事务控制语句以及并发事务的隔离问题。 第 13 章介绍了数据库设计过程中的常用技术,同时还介绍了如何为表中的字段选择合适的 数据类型,以及数据库常见对象(数据库、模式和数据表)的管理。 第 14 章介绍了索引的原理,讲解了如何通过执行计划查看 SQL 语句的执行过程,以及常 用的查询优化技巧。 ? IV ? 前言 ? V ? 第 15 章介绍了另一个重要的数据库对象:视图(View)。 第 16 章介绍了数据库存储过程(Stored Procedure)和存储函数(Stored Function)的基本 概念。 第 17 章介绍了一种特殊的存储过程/函数:触发器(Trigger)。 第 18 章介绍了 SQL 标准的一些最新发展趋势,包括文档存储(JSON)、行模式识别 (MATCH_RECOGNIZE)、多维数组(SQL/MDA)以及图形存储(SQL/PGQ)。 附录 A 列举了常用 SQL 语句的语法说明和对应的章节,方便读者快速查看相关内容。 本书中涉及的一些示例表和初始化数据,读者可通过“读者服务”获取,使用说明可以参 考相关目录中的 README.txt 文件。 本书特点 本书主要有两个特点:新和全。首先,本书基于最新的 SQL:2019 标准,紧跟产业发展的 趋势,可帮助读者解锁最前沿的 SQL 技能。其次,本书全面覆盖了从 SQL 基础查询到高级分 析、从数据库设计到查询优化等知识点,并且提供了 5 种主流数据库的代码实现,包括: ? MySQL 8.0 ? Oracle Database 21c ? Microsoft SQL Server 2019 ? PostgreSQL 14 ? SQLite 3.36 由于 SQL 语言的通用性,本书内容大多数情况下也适用于其他数据库系统。 读者对象 数据库工程师或 DBA、数据分析师或数据科学家、开发人员或测试人员、产品经理或运营 人员、SQL 爱好者或希望了解不同数据库实现的专家,都可以通过本书获得 SQL 技能和编程思 维的提升。
第 1 章 一切皆关系.................................................................................................................1 1.1 数据库 ...................................................................................................................................1 1.1.1 数据库的发展历史 ...................................................................................................2 1.1.2 数据库管理系统 .......................................................................................................3 1.2 关系型数据库 .......................................................................................................................4 1.2.1 数据结构 ...................................................................................................................4 1.2.2 关系操作 ...................................................................................................................5 1.2.3 完整性约束 ...............................................................................................................5 1.3 SQL 简介...............................................................................................................................6 1.3.1 SQL 的历史...............................................................................................................7 1.3.2 语法特性 ...................................................................................................................7 1.3.3 面向集合 ...................................................................................................................8 1.3.4 标准与实现 ...............................................................................................................9 1.4 小结 ..................................................................................................................................... 10 第 2 章 查询初体验...............................................................................................................11 2.1 基本检索功能 ..................................................................................................................... 11 SQL 编程思想:基于 5 种主流数据库代码实现 2.1.1 查询指定字段 ......................................................................................................... 12 2.1.2 查询全部字段 ......................................................................................................... 13 2.1.3 快速查询信息 ......................................................................................................... 13 2.2 实现数据过滤 ..................................................................................................................... 14 2.2.1 简单过滤条件 ......................................................................................................... 15 2.2.2 空值判断条件 ......................................................................................................... 17 2.2.3 文本模糊查找 ......................................................................................................... 18 2.2.4 组合过滤条件 ......................................................................................................... 21 2.2.5 排除重复数据 ......................................................................................................... 23 2.3 从无序到有序 ..................................................................................................................... 24 2.3.1 基于单个字段排序 .................................................................................................24 2.3.2 基于多个字段排序 .................................................................................................25 2.3.3 基于表达式排序 ..................................................................................................... 26 2.3.4 空值的排序位置 ..................................................................................................... 27 2.3.5 中文的排序方式 ..................................................................................................... 28 2.4 限定结果数量 ..................................................................................................................... 30 2.4.1 Top-N 排行榜.......................................................................................................... 30 2.4.2 数据分页显示 ......................................................................................................... 31 2.5 SQL 注释............................................................................................................................. 34 2.5.1 单行注释 ................................................................................................................. 34 2.5.2 多行注释 ................................................................................................................. 34 2.5.3 特殊注释 ................................................................................................................. 35 2.6 小结 ..................................................................................................................................... 35 第 3 章 逻辑处理功能 ...........................................................................................................36 3.1 函数和运算 ......................................................................................................................... 36 3.1.1 函数概述 ................................................................................................................. 37 3.1.2 数值函数 ................................................................................................................. 37 3.1.3 字符函数 ................................................................................................................. 41 3.1.4 日期函数 ................................................................................................................. 47 3.1.5 转换函数 ................................................................................................................. 50 3.1.6 案例分析 ................................................................................................................. 51 ? VIII ? 目录 3.2 使用别名 ............................................................................................................................. 53 3.2.1 列别名 ..................................................................................................................... 53 3.2.2 表别名 ..................................................................................................................... 54 3.3 条件表达式 ......................................................................................................................... 54 3.3.1 简单 CASE 表达式 .................................................................................................55 3.3.2 搜索 CASE 表达式 .................................................................................................56 3.3.3 DECODE 函数........................................................................................................ 58 3.3.4 IF 函数..................................................................................................................... 59 3.3.5 IIF 函数 ................................................................................................................... 59 3.3.6 案例分析 ................................................................................................................. 60 3.4 小结 ..................................................................................................................................... 61 第 4 章 数据分组与汇总........................................................................................................62 4.1 数据汇总 ............................................................................................................................. 62 4.1.1 聚合函数 ................................................................................................................. 63 4.1.2 使用 COUNT 函数统计行数..................................................................................63 4.1.3 使用 AVG 函数计算平均值...................................................................................64 4.1.4 使用 SUM 函数计算总和....................................................................................... 66 4.1.5 使用 MAX 函数返回最大值 ..................................................................................66 4.1.6 使用 MIN 函数返回最小值....................................................................................67 4.1.7 使用 LISTAGG 函数连接字符串 ..........................................................................67 4.2 数据分组 ............................................................................................................................. 69 4.2.1 创建数据分组 ......................................................................................................... 69 4.2.2 进行组内汇总 ......................................................................................................... 70 4.2.3 空值分为一组 ......................................................................................................... 71 4.2.4 常见的语法问题 ..................................................................................................... 72 4.3 再次过滤数据 ..................................................................................................................... 73 4.3.1 使用 HAVING 过滤分组结果................................................................................73 4.3.2 WHERE 与 HAVING 的区别 ................................................................................73 4.4 多维数据分析 ..................................................................................................................... 74 4.4.1 小计、合计与总计 .................................................................................................74 4.4.2 交叉统计报表 ......................................................................................................... 75 ? IX ? SQL 编程思想:基于 5 种主流数据库代码实现 4.4.3 自定义维度统计 ..................................................................................................... 76 4.4.4 GROUPING 函数.................................................................................................... 78 4.5 案例分析 ............................................................................................................................. 79 4.5.1 案例一:实现行列转换 ......................................................................................... 79 4.5.2 案例二:销售数据分析 ......................................................................................... 80 4.6 小结 ..................................................................................................................................... 83 第 5 章 空值问题...................................................................................................................84 5.1 三值逻辑 ............................................................................................................................. 85 5.2 空值的比较 ......................................................................................................................... 86 5.3 空值的分组 ......................................................................................................................... 88 5.4 空值的排序 ......................................................................................................................... 88 5.5 函数中的空值 ..................................................................................................................... 89 5.6 空值处理函数 ..................................................................................................................... 90 5.7 空值与约束 ......................................................................................................................... 93 5.8 案例分析 ............................................................................................................................. 95 5.9 小结 ..................................................................................................................................... 97 第 6 章 连接多个表...............................................................................................................98 6.1 连接的语法与类型 ............................................................................................................. 99 6.1.1 使用 FROM 和 WHERE 连接两个表....................................................................99 6.1.2 使用 JOIN 和 ON 连接两个表...............................................................................99 6.1.3 连接查询的类型 ................................................................................................... 100 6.2 内连接 ............................................................................................................................... 100 6.2.1 等值连接 ............................................................................................................... 100 6.2.2 非等值连接 ........................................................................................................... 101 6.3 外连接 ............................................................................................................................... 101 6.3.1 左外连接 ............................................................................................................... 101 6.3.2 右外连接 ............................................................................................................... 103 6.3.3 全外连接 ............................................................................................................... 104 6.4 交叉连接 ........................................................................................................................... 105 6.5 自然连接 ........................................................................................................................... 106 ? X ? 目录 6.6 自连接 ............................................................................................................................... 107 6.7 连接多个表 ....................................................................................................................... 108 6.8 案例分析 ........................................................................................................................... 109 6.8.1 案例一:生成数字序列 ....................................................................................... 109 6.8.2 案例二:员工考勤记录 ....................................................................................... 110 6.9 小结 ................................................................................................................................... 112 第 7 章 嵌套子查询.............................................................................................................113 7.1 查询中的查询 ................................................................................................................... 113 7.2 标量子查询 ....................................................................................................................... 115 7.3 行子查询 ........................................................................................................................... 115 7.4 表子查询 ........................................................................................................................... 116 7.4.1 WHERE 条件中的子查询 ....................................................................................116 7.4.2 ALL、ANY 运算符.............................................................................................. 117 7.4.3 FROM 子句中的子查询....................................................................................... 119 7.5 关联子查询 ....................................................................................................................... 121 7.6 横向子查询 ....................................................................................................................... 122 7.7 EXISTS 运算符................................................................................................................. 123 7.8 案例分析 ........................................................................................................................... 126 7.8.1 案例一:月度销售冠军 ....................................................................................... 126 7.8.2 案例二:销售增长之星 ....................................................................................... 127 7.9 小结 ................................................................................................................................... 128 第 8 章 表的集合运算 .........................................................................................................129 8.1 集合运算 ........................................................................................................................... 129 8.2 交集求同 ........................................................................................................................... 130 8.3 并集存异 ........................................................................................................................... 132 8.4 差集排他 ........................................................................................................................... 134 8.5 集合运算与排序 ............................................................................................................... 136 8.6 运算符的优先级 ............................................................................................................... 137 8.7 案例分析 ........................................................................................................................... 139 8.7.1 案例一:优秀员工分析 ......................................................................................... 139 ? XI ? SQL 编程思想:基于 5 种主流数据库代码实现 8.7.2 案例二:用户权限管理 ......................................................................................... 142 8.8 小结 ................................................................................................................................... 144 第 9 章 通用表表达式 .........................................................................................................145 9.1 表即变量 ........................................................................................................................... 145 9.2 强大的递归 ....................................................................................................................... 148 9.2.1 递归查询语法 ....................................................................................................... 149 9.2.2 生成数字序列 ....................................................................................................... 149 9.2.3 遍历层次结构 ....................................................................................................... 150 9.2.4 递归的终止 ........................................................................................................... 153 9.3 案例分析:社交网络关系................................................................................................ 154 9.3.1 数据结构 ............................................................................................................... 154 9.3.2 好友关系分析 ....................................................................................................... 157 9.3.3 粉丝关系分析 ....................................................................................................... 161 9.4 小结 ................................................................................................................................... 163 第 10 章 窗口函数...............................................................................................................164 10.1 窗口函数定义 ................................................................................................................. 164 10.1.1 创建数据分区 ..................................................................................................... 166 10.1.2 分区内的排序 ..................................................................................................... 167 10.1.3 指定窗口大小 ..................................................................................................... 168 10.1.4 窗口函数分类 ..................................................................................................... 169 10.2 聚合窗口函数 ................................................................................................................. 170 10.2.1 案例分析:移动平均值 .....................................................................................170 10.2.2 案例分析:累计求和 ......................................................................................... 171 10.3 排名窗口函数 ................................................................................................................. 173 10.3.1 案例分析:分类排名 ......................................................................................... 174 10.3.2 案例分析:累积分布 ......................................................................................... 176 10.4 取值窗口函数 ................................................................................................................. 177 10.4.1 案例分析:环比、同比分析..............................................................................177 10.4.2 案例分析:复合增长率 .....................................................................................179 10.5 小结 ................................................................................................................................. 181 ? XII ? 目录 第 11 章 数据的增删改合....................................................................................................182 11.1 插入数据 ......................................................................................................................... 182 11.1.1 插入单行记录 ..................................................................................................... 183 11.1.2 插入多行记录 ..................................................................................................... 185 11.1.3 复制数据 ............................................................................................................. 186 11.2 更新数据 ......................................................................................................................... 187 11.2.1 单表更新 ............................................................................................................. 187 11.2.2 关联更新 ............................................................................................................. 188 11.3 删除数据 ......................................................................................................................... 189 11.3.1 单表删除 ............................................................................................................. 189 11.3.2 关联删除 ............................................................................................................. 189 11.3.3 快速删除全表数据 ............................................................................................. 190 11.4 合并数据 ......................................................................................................................... 191 11.4.1 标准合并语句 ..................................................................................................... 191 11.4.2 非标准合并语句 .................................................................................................194 11.5 外键约束与级联操作 ..................................................................................................... 195 11.5.1 违反外键约束 ..................................................................................................... 195 11.5.2 级联更新和删除 .................................................................................................196 11.6 小结 ................................................................................................................................. 198 第 12 章 数据库事务...........................................................................................................199 12.1 什么是数据库事务 ......................................................................................................... 199 12.2 事务的 ACID 属性.......................................................................................................... 201 12.3 事务控制语句 ................................................................................................................. 201 12.3.1 开始事务 ............................................................................................................. 202 12.3.2 提交事务 ............................................................................................................. 203 12.3.3 撤销事务 ............................................................................................................. 204 12.3.4 事务保存点 ......................................................................................................... 204 12.4 并发事务与隔离级别 ..................................................................................................... 205 12.4.1 并发问题 ............................................................................................................. 205 12.4.2 隔离级别 ............................................................................................................. 206 12.5 案例分析 ......................................................................................................................... 207 ? XIII ? SQL 编程思想:基于 5 种主流数据库代码实现 12.6 小结 ................................................................................................................................. 210 第 13 章 数据库设计与实现 ................................................................................................211 13.1 实体关系图 ..................................................................................................................... 211 13.1.1 实体..................................................................................................................... 212 13.1.2 属性..................................................................................................................... 212 13.1.3 关系..................................................................................................................... 212 13.1.4 ERD 建模 ............................................................................................................ 213 13.2 规范化设计 ..................................................................................................................... 214 13.2.1 数据异常 ............................................................................................................. 214 13.2.2 第一范式 ............................................................................................................. 215 13.2.3 第二范式 ............................................................................................................. 216 13.2.4 第三范式 ............................................................................................................. 217 13.2.5 主键与外键 ......................................................................................................... 218 13.2.6 反规范化 ............................................................................................................. 219 13.3 数据类型 ......................................................................................................................... 219 13.3.1 数字类型 ............................................................................................................. 220 13.3.2 字符串类型 ......................................................................................................... 221 13.3.3 日期时间类型 ..................................................................................................... 222 13.3.4 二进制类型 ......................................................................................................... 223 13.3.5 选择合适的数据类型 ......................................................................................... 223 13.4 管理数据库对象 ............................................................................................................. 224 13.4.1 常见对象 ............................................................................................................. 224 13.4.2 管理数据库 ......................................................................................................... 225 13.4.3 管理模式 ............................................................................................................. 226 13.4.4 管理数据表 ......................................................................................................... 227 13.5 小结 ................................................................................................................................. 231 第 14 章 索引与性能优化....................................................................................................232 14.1 索引的原理 ..................................................................................................................... 232 14.1.1 聚集索引 ............................................................................................................. 234 14.1.2 非聚集索引 ......................................................................................................... 234 ? XIV ? 目录 14.2 索引的类型 ..................................................................................................................... 235 14.2.1 唯一索引与非唯一索引 .....................................................................................235 14.2.2 单列索引与多列索引 ......................................................................................... 235 14.2.3 升序索引与降序索引 ......................................................................................... 236 14.2.4 函数索引 ............................................................................................................. 236 14.3 索引的维护 ..................................................................................................................... 236 14.3.1 创建索引 ............................................................................................................. 236 14.3.2 查看索引 ............................................................................................................. 237 14.3.3 删除索引 ............................................................................................................. 237 14.3.4 注意事项 ............................................................................................................. 238 14.4 执行计划 ......................................................................................................................... 238 14.4.1 查询语句的执行过程 ......................................................................................... 238 14.4.2 查看 SQL 语句的执行计划................................................................................241 14.5 查询优化技巧 ................................................................................................................. 244 14.5.1 创建合适的索引 .................................................................................................244 14.5.2 避免索引失效 ..................................................................................................... 246 14.5.3 只返回需要的结果 ............................................................................................. 247 14.5.4 优化多表连接 ..................................................................................................... 248 14.5.5 尽量避免使用子查询 ......................................................................................... 249 14.5.6 优化集合操作 ..................................................................................................... 251 14.5.7 不要使用 OFFSET 实现分页.............................................................................251 14.5.8 记住 SQL 子句的逻辑执行顺序........................................................................252 14.6 小结 ................................................................................................................................. 254 第 15 章 视图不是表...........................................................................................................255 15.1 视图概述 ......................................................................................................................... 255 15.1.1 什么是视图 ......................................................................................................... 255 15.1.2 视图的优缺点 ..................................................................................................... 256 15.2 管理视图 ......................................................................................................................... 256 15.2.1 创建视图 ............................................................................................................. 256 15.2.2 视图中的 ORDER BY 子句 ...............................................................................258 15.2.3 修改视图的定义 .................................................................................................258 ? XV ? SQL 编程思想:基于 5 种主流数据库代码实现 15.2.4 删除视图 ............................................................................................................. 259 15.3 可更新视图 ..................................................................................................................... 260 15.3.1 可更新视图的限制 ............................................................................................. 261 15.3.2 通过视图修改数据 ............................................................................................. 261 15.3.3 限制视图的操作 .................................................................................................262 15.4 案例分析 ......................................................................................................................... 263 15.5 小结 ................................................................................................................................. 264 第 16 章 存储过程和存储函数.............................................................................................265 16.1 存储过程概述 ................................................................................................................. 265 16.1.1 什么是存储过程 .................................................................................................266 16.1.2 存储过程的优缺点 ............................................................................................. 266 16.2 管理存储过程 ................................................................................................................. 267 16.2.1 创建存储过程 ..................................................................................................... 267 16.2.2 执行存储过程 ..................................................................................................... 271 16.2.3 修改存储过程 ..................................................................................................... 272 16.2.4 删除存储过程 ..................................................................................................... 272 16.3 使用存储函数 ................................................................................................................. 272 16.3.1 存储函数和存储过程的区别..............................................................................273 16.3.2 创建存储函数 ..................................................................................................... 273 16.3.3 调用存储函数 ..................................................................................................... 275 16.3.4 修改存储函数 ..................................................................................................... 276 16.3.5 删除存储函数 ..................................................................................................... 276 16.4 案例分析 ......................................................................................................................... 276 16.5 小结 ................................................................................................................................. 280 第 17 章 一触即发的触发器 ................................................................................................281 17.1 触发器概述 ..................................................................................................................... 281 17.1.1 触发器的原理 ..................................................................................................... 281 17.1.2 触发器的分类 ..................................................................................................... 282 17.2 管理触发器 ..................................................................................................................... 283 17.2.1 创建触发器 ......................................................................................................... 283 ? XVI ? 目录 17.2.2 验证触发器 ......................................................................................................... 287 17.2.3 查看触发器 ......................................................................................................... 288 17.2.4 启用、禁用触发器 ............................................................................................. 289 17.2.5 删除触发器 ......................................................................................................... 290 17.3 案例分析 ......................................................................................................................... 290 17.3.1 案例一:禁止 DDL 操作 ...................................................................................290 17.3.2 案例二:替换视图的 DML 操作.......................................................................293 17.4 小结 ................................................................................................................................. 296 第 18 章 超越关系...............................................................................................................297 18.1 文档存储 ......................................................................................................................... 297 18.1.1 JSON 数据类型................................................................................................... 298 18.1.2 将 JSON 对象表示成 SQL 数据 ........................................................................303 18.1.3 将 SQL 数据表示成 JSON 对象 ........................................................................304 18.2 复杂事件 ......................................................................................................................... 305 18.2.1 行模式识别 ......................................................................................................... 305 18.2.2 分析股票曲线图 .................................................................................................306 18.2.3 监控可疑的银行转账 ......................................................................................... 308 18.3 多维数组 ......................................................................................................................... 310 18.3.1 数组的存储和访问 ............................................................................................. 310 18.3.2 数组处理函数 ..................................................................................................... 313 18.4 图形存储 ......................................................................................................................... 315 18.4.1 图形查询语言与 SQL/PGQ................................................................................316 18.4.2 社交网络关系分析 ............................................................................................. 317 18.5 小结 ................................................................................................................................. 320 附录 A SQL 常用语句速查表 ..............................................................................................321 ? XVII ?