第1章 数据库技术基础 1
1.1 数据库应用的场合 1
1.2 常用术语 1
1.3 数据库系统的构成 1
1.3.1 硬件 1
1.3.2 软件 2
1.3.3 人员 2
第2章 关系模型理论及主要产品 3
2.1 数据处理的历史 3
2.2 数据模型的概念 3
2.3 网状模型与层次模型 4
2.3.1 网状模型 4
2.3.2 层次模型 4
2.3.3 网状模型和层次模型的贡献及缺陷 5
2.4 关系模型的提出和成熟 5
2.4.1 关系模型要解决的问题 5
2.4.2 关系模型的提出与完善 6
2.4.3 IBM的System R项目 6
2.4.4 加州大学伯克利分校的Ingres项目 6
2.5 关系模型的三个要素 7
2.5.1 关系模型的数据结构 7
2.5.2 关系模型的数据操作方式 8
2.5.3 关系模型中的完整性约束 8
2.5.4 关系型数据库的特点 8
2.6 主要关系型数据库产品介绍 9
2.6.1 传统商业数据库产品 9
2.6.2 开源数据库与MySQL 9
第3章 ER模型 10
3.1 数据库设计的主要步骤 10
3.2 ER模型的主要概念 10
3.3 联系的映射约束 11
3.4 ER图转化为表 11
3.5 使用MySQL Workbench进行数据库设计 11
第4章 规范化理论 17
4.1 引入范式理论的原因 17
4.1.1 存在数据冗余的概念设计举例 17
4.1.2 Insertion异常 18
4.1.3 Deletion异常 18
4.1.4 Update异常 18
4.2 第一范式 18
4.3 第二范式 19
4.4 第三范式 20
第5章 安装和使用MySQL 21
5.1 支持MySQL 8.0的操作系统 21
5.2 在VMware 16.1虚拟机中安装Oracle Linux 8.3 21
5.2.1 下载VMware和Oracle Linux 21
5.2.2 安装Oracle Linux 22
5.3 使用Windows SSH工具管理Oracle Linux服务器 24
5.3.1 使用Windows 10的SSH工具操作Oracle Linux服务器 25
5.3.2 使用Windows 10的scp工具远程复制文件 25
5.4 使用MobaXterm操作Oracle Linux服务器 25
5.4.1 建立连接及基本SSH配置 26
5.4.2 MobaXterm基本配置 26
5.4.3 在Windows和Linux之间拖动传输文件 27
5.4.4 显示X Window图形 27
5.5 使用dnf工具 28
5.5.1 repo配置文件 28
5.5.2 管理yum源 29
5.5.3 管理软件包 30
5.5.4 dnf模块管理 30
5.6 安装与删除MySQL服务器软件 32
5.6.1 检查MySQL软件是否已安装 32
5.6.2 使用Oracle Linux系统附带软件包安装 32
5.6.3 管理MySQL服务 32
5.6.4 删除MySQL软件 33
5.6.5 使用MySQL官方yum源安装 34
5.7 升级MySQL 34
5.8 目录结构 35
5.9 连接至mysqld服务 35
5.9.1 连接至本地mysqld服务 35
5.9.2 连接至远端mysqld服务 35
5.10 mysql工具执行常见操作 36
5.11 创建测试数据 37
第6章 SQL查询语句 40
6.1 SQL概述 40
6.1.1 SQL语言的历史 40
6.1.2 SQL的发音 41
6.1.3 SQL查询的特点 41
6.1.4 SQL标准 41
6.2 SQL语言的主要类型 41
6.3 常用数据类型 42
6.3.1 数值类型 42
6.3.2 字符串类型 42
6.3.3 日期时间类型 42
6.4 简单的SQL查询语句 43
6.4.1 最简单的查询——只指定表 43
6.4.2 指定列 43
6.4.3 指定列别名 43
6.4.4 用where子句指定查询条件 44
6.4.5 使用order by子句给查询结果排序 44
6.4.6 分页查询 45
6.5 常用数值运算符及函数 45
6.5.1 数值运算符 45
6.5.2 常用数值函数 45
6.6 字符数据的处理 46
6.6.1 字符串常量 46
6.6.2 字符串模糊查询 46
6.6.3 处理字符串中的特殊字符 47
6.6.4 常用字符串函数 47
6.6.5 利用正则表达式搜索字符串 51
6.7 处理日期型数据 53
6.7.1 获得当前日期时间 53
6.7.2 日期型常量 53
6.7.3 指定格式显示日期型列值 53
6.7.4 抽取日期的指定部分 54
6.7.5 获取时间差 54
6.8 空值的处理 55
6.9 分组汇总 56
6.9.1 单独使用分组函数 56
6.9.2 使用group by子句执行分组汇总 56
6.9.3 having子句 57
6.9.4 order by子句 57
6.9.5 分组汇总查询小结 57
6.10 子查询 58
6.10.1 where子句中使用子查询 58
6.10.2 select子句中使用子查询 59
6.10.3 from子句中使用子查询 59
6.10.4 非相关子查询与相关子查询 59
6.10.5 in与not in 62
6.10.6 exists与not exists 64
6.11 集合运算 65
6.12 多表连接查询 65
6.12.1 交叉连接 65
6.12.2 内连接 66
6.12.3 两种连接标准:SQL-86与SQL-92 67
6.12.4 外连接 68
6.13 构造复杂的查询语句 70
6.14 SQL查询的等效转换 72
6.14.1 内连接与子查询 72
6.14.2 in,exists,内连接 72
6.14.3 not in,not exist,外连接 73
第7章 窗口函数 74
7.1 over()子句构造窗口 74
7.1.1 partition by子句构造窗口 74
7.1.2 order by子句设置窗口内排序 75
7.1.3 窗口内划分框架 76
7.1.4 命名窗口 79
7.2 窗口函数分类与示例 79
7.2.1 汇总函数 79
7.2.2 排名函数 80
第8章 数据修改语句 83
8.1 delete语句 83
8.1.1 简单的delete语句 83
8.1.2 delete语句使用limit子句 83
8.1.3 delete语句同时删除多个表的行 83
8.2 update语句 84
8.2.1 简单的update语句 84
8.2.2 update语句修改多个表 84
8.3 insert语句 85
8.4 replace语句 85
第9章 表及约束 87
9.1 创建简单的表 87
9.2 字符集及排序规则 87
9.2.1 MySQL与Unicode字符集 87
9.2.2 排序规则与中文排序 89
9.2.3 建表时设置字符集及排序规则 89
9.3 建表时指定存储引擎 90
9.4 使用auto_increment自增列 90
9.5 自填充时间列 91
9.6 约束 92
9.6.1 约束的种类 92
9.6.2 主键、非空及默认约束 92
9.6.3 唯一、检查及外键约束 93
9.6.4 对表增加约束 95
9.6.5 删除约束 96
9.6.6 查询约束的信息 96
9.7 复制表 97
9.8 修改表的结构 97
9.8.1 修改列的数据类型 97
9.8.2 添加或删除列 98
9.8.3 修改列名 98
9.8.4 修改表名 98
9.8.5 清空表:truncate table 98
9.8.6 删除表 99
9.9 查看表定义 99
第10章 分区表 100
10.1 分区类别 100
10.2 范围分区 100
10.2.1 单列范围分区 100
10.2.2 多列范围分区 102
10.2.3 增删范围分区 104
10.2.4 重组分区 105
10.3 列表分区 106
10.3.1 单列列表分区 106
10.3.2 多列列表分区 106
10.3.3 增删列表分区 108
10.3.4 重组列表分区 109
10.4 散列分区 109
10.4.1 普通散列分区 110
10.4.2 线性散列分区 110
10.4.3 键分区 111
10.4.4 重组散列分区 112
10.5 子分区 112
10.6 查询分区信息 113
10.7 改变表的分区类型 115
10.8 在SQL命令中直接操作分区 116
第11章 程序设计 117
11.1 用户变量 117
11.2 存储过程 118
11.2.1 存储过程的创建和执行 118
11.2.2 使用变量 118
11.2.3 使用if语句 119
11.2.4 使用while循环语句 120
11.2.5 使用输入参数及SQL语句 120
11.2.6 使用输出参数 121
11.3 函数 122
11.4 触发器 123
11.4.1 创建触发器的语法 123
11.4.2 old和new的用法 124
11.4.3 模拟外键级联删除 125
11.4.4 约束检查 125
11.4.5 审计 127
11.4.6 查看触发器信息 128
11.5 查看可编程对象系统信息 128
11.5.1 使用show命令查看程序定义 129
11.5.2 使用information_schema系统库的routines和triggers视图 129
11.6 删除可编程对象 130
第12章 服务器体系结构 131
12.1 总体结构 131
12.2 内存结构 132
12.2.1 内存数据缓冲区 132
12.2.2 内存日志缓冲区 133
12.2.3 排序缓冲区和连接缓冲区 134
12.2.4 内部临时表内存 134
12.2.5 内存的自动设置 134
12.3 配置服务器和客户端参数 134
12.3.1 设置方式 135
12.3.2 使用命令行参数 135
12.3.3 使用配置文件 135
12.3.4 使用set命令 136
12.3.5 查看系统参数 136
12.4 事件日志文件 138
12.4.1 设置日志的时区和输出目标 138
12.4.2 错误日志 139
12.4.3 通用查询日志 140
12.4.4 慢查询日志 141
12.5 重做文件 141
12.5.1 binary log 141
12.5.2 redo log 145
12.6 系统数据库 146
12.6.1 mysql 146
12.6.2 sys 147
12.6.3 performance_schema 150
12.6.4 information_schema 150
第13章 表空间和数据文件 151
13.1 表空间的概念 151
13.1.1 数据目录 151
13.1.2 MySQL的表空间分类 151
13.2 system表空间 152
13.2.1 change buffer 152
13.2.2 doublewrite buffer 152
13.2.3 system表空间的数据文件 152
13.3 temporary表空间 153
13.3.1 会话临时表空间 153
13.3.2 全局临时表空间 154
13.4 undo表空间 155
13.4.1 默认undo表空间 155
13.4.2 创建undo表空间 155
13.4.3 查询undo表空间信息 155
13.4.4 截断undo表空间 156
13.4.5 删除undo表空间 157
13.5 file-per-table表空间 157
13.6 general表空间 159
13.7 移动表所属的表空间 161
第14章 B树索引 162
14.1 B树索引能把查询速度提高多少 162
14.2 一个使用索引的例子 163
14.3 主键索引的结构 165
14.4 普通索引的结构 168
14.5 索引能够提高查询速度的原因 172
14.6 需要创建索引的情况 172
14.7 如何知道一个查询是否使用了索引 172
14.8 不使用索引的情况 174
14.9 DML语句对索引的影响 174
14.9.1 insert语句对索引的影响 174
14.9.2 delete语句对索引的影响 174
14.9.3 update语句对索引的影响 174
14.10 基于函数的索引 174
14.11 设置索引的可见性 175
14.12 多列索引 176
14.13 约束与索引 177
14.14 查询索引的系统信息 177
14.14.1 show create table 177
14.14.2 show index from 178
14.14.3 查询information_schema.innodb_indexes 178
第15章 执行计划 180
15.1 执行计划简单示例 180
15.2 执行计划的select_type属性 181
15.3 执行计划的type属性 186
15.4 执行计划的ref属性 189
15.5 执行计划的Extra属性 191
第16章 统计信息 195
16.1 统计信息的内容 195
16.2 统计信息的分类和收集 195
16.2.1 永久统计信息 195
16.2.2 临时统计信息 196
16.3 统计信息的存储和监控 197
16.3.1 innodb_index_stats系统表 197
16.3.2 innodb_table_stats系统表 198
16.3.3 information_schema中的统计信息视图 198
16.3.4 show命令 201
16.3.5 information_schema_stats_expiry参数 203
16.4 统计信息的更新 203
16.4.1 自动更新 203
16.4.2 手动更新 204
16.5 列的直方图 204
16.5.1 直方图的作用 205
16.5.2 单值直方图和等高直方图 205
16.5.3 计算直方图 205
16.5.4 应用直方图实例 207
第17章 事务处理 210
17.1 事务的概念及应用实例 210
17.1.1 事务应用实例1:银行转账 210
17.1.2 事务应用实例2:超市收银 210
17.2 事务的ACID属性 211
17.2.1 原子性 211
17.2.2 一致性 211
17.2.3 隔离性 212
17.2.4 持久性 212
17.3 事务隔离级别 212
17.3.1 read uncommitted 212
17.3.2 read committed 212
17.3.3 repeatable read 213
17.3.4 serializable 214
17.4 事务控制命令 214
17.4.1 commit和rollback命令 214
17.4.2 设置事务模式 215
17.4.3 设置事务隔离级别 215
17.4.4 设置事务只读性 216
17.5 并发控制要解决的问题 217
17.5.1 丢失更新 217
17.5.2 脏读 218
17.5.3 不可重复读 219
第18章 锁 220
18.1 MySQL的锁类型和锁模式 220
18.2 表锁 221
18.2.1 表级S锁和表级X锁 221
18.2.2 DDL语句产生的元数据锁 222
18.2.3 表级IS锁和表级IX锁 223
18.3 行锁 224
18.3.1 S,REC_NOT_GAP锁和X,REC_NOT_GAP锁 224
18.3.2 S,GAP锁和X,GAP锁 226
18.3.3 next-key锁 227
18.3.4 insert intention锁 230
18.4 insert操作产生的隐式锁 233
18.5 外键对锁的影响 234
18.6 不同隔离级别下的加锁方式 235
18.6.1 read uncommitted与read committed隔离级别下的锁 235
18.6.2 repeatable read隔离级别下的锁 240
18.6.3 serializable隔离级别下的锁 241
18.7 死锁 243
第19章 备份恢复 246
19.1 备份种类 246
19.1.1 热备份与冷备份 246
19.1.2 逻辑备份与物理备份 246
19.1.3 全备份与增量备份 246
19.2 恢复种类 246
19.3 备份恢复工具 247
19.4 导出导入数据行 248
19.4.1 一个简单示例 248
19.4.2 使用select into outfile及load data执行导出导入 249
19.4.3 使用mysqlimport导入 249
19.4.4 使用mysqldump导出 250
19.5 mysqlpump执行逻辑备份 250
19.5.1 mysqlpump执行导出 250
19.5.2 mysqlpump的常用选项 251
19.6 使用mysqlbinlog导出二进制日志文件 252
19.7 基于时点的恢复 253
第20章 用户和权限管理 255
20.1 MySQL用户的特点 255
20.2 预置用户 255
20.3 一个关于用户及权限的简单示例 256
20.4 用户管理 256
20.4.1 MySQL的用户名标识 257
20.4.2 创建和删除用户 257
20.5 密码管理 257
20.5.1 密码加密算法 257
20.5.2 设置密码过期和重用规则 258
20.5.3 设置密码试错次数上限及锁定天数 258
20.5.4 查询用户的密码相关属性 259
20.5.5 设置密码相关系统参数 259
20.5.6 设置密码复杂度规则 260
20.6 对用户设置资源限制 261
20.7 修改用户属性 261
20.8 权限管理 262
20.8.1 MySQL中的权限层次和名称 262
20.8.2 赋予和撤销权限 262
20.8.3 全局权限的部分撤销 264
20.8.4 查询用户的权限信息 266
20.9 角色 270
20.9.1 创建角色并对其赋权 270
20.9.2 角色的赋予及撤销 271
20.9.3 激活角色 272
20.9.4 用户的默认角色 273
20.9.5 设置公共角色 274
20.9.6 角色相关信息查询 274
参考文献 276