第一部分 SQL概念综述
第1章 欢迎来到SQL世界 3
1.1 SQL定义及历史 3
1.1.1 什么是SQL 4
1.1.2 什么是ANSI SQL 4
1.1.3 新标准:SQL-2003 4
1.1.4 什么是数据库 5
1.1.5 关系型数据库 5
1.1.6 客户端/服务器技术 6
1.1.7 基于Web的数据库系统 7
1.1.8 主流数据库厂商 7
1.2 SQL会话 8
1.2.1 CONNECT 8
1.2.2 DISCONNECT和EXIT 8
1.3 SQL命令的类型 8
1.3.1 定义数据库结构 9
1.3.2 操作数据 9
1.3.3 选择数据 9
1.3.4 数据控制语言 9
1.3.5 数据管理命令 10
1.3.6 事务控制命令 10
1.4 本书使用的数据库 10
1.4.1 表命名标准 11
1.4.2 数据一瞥 11
1.4.3 表的构成 12
1.4.4 MySQL范例和练习 14
1.5 小结 14
1.6 问与答 14
1.7 实践 15
1.7.1 测验 15
1.7.2 练习 15
第二部分 建立数据库
第2章 定义数据结构 19
2.1 数据是什么 19
2.2 基本数据类型 19
2.2.1 定长字符串 20
2.2.2 变长字符串 20
2.2.3 大对象类型 21
2.2.4 数值类型 21
2.2.5 小数类型 22
2.2.6 整数 22
2.2.7 浮点数 23
2.2.8 日期和时间类型 23
2.2.9 直义字符串 23
2.2.10 NULL数据类型 24
2.2.11 布尔值 24
2.2.12 自定义类型 24
2.2.13 域 25
2.3 小结 25
2.4 问与答 26
2.5 实践 26
2.5.1 测验 26
2.5.2 练习 27
第3章 管理数据库对象 29
3.1 什么是数据库对象 29
3.2 什么是规划 29
3.3 表:数据的主要存储方式 31
3.3.1 列 31
3.3.2 行 32
3.3.3 CREATE TABLE语句 32
3.3.4 命名规范 33
3.3.5 ALTER TABLE命令 33
3.3.6 从现有表新建另一个表 35
3.3.7 删除表 36
3.4 完整性约束 36
3.4.1 主键约束 36
3.4.2 惟一性约束 37
3.4.3 外键约束 38
3.4.4 NOT NULL约束 38
3.4.5 检查约束 39
3.4.6 去除约束 39
3.5 小结 40
3.6 问与答 40
3.7 实践 40
3.7.1 测验 41
3.7.2 练习 41
第4章 规格化过程 42
4.1 规格化数据库 42
4.1.1 原始数据库 42
4.1.2 数据库逻辑设计 43
4.1.3 规格形式 44
4.1.4 命名规范 46
4.1.5 规格化的优点 47
4.1.6 规格化的缺点 47
4.2 去规格化数据库 48
4.3 小结 48
4.4 问与答 48
4.5 实践 49
4.5.1 测验 49
4.5.2 练习 49
第5章 操作数据 51
5.1 数据操作概述 51
5.2 用新数据填充表 51
5.2.1 把数据插入到表 52
5.2.2 给表里指定列插入数据 53
5.2.3 从另一个表插入数据 53
5.2.4 插入NULL值 55
5.3 更新现有数据 55
5.3.1 更新一列的数据 55
5.3.2 更新一条或多记录里的多个字段 56
5.4 从表里删除数据 56
5.5 小结 57
5.6 问与答 57
5.7 实践 58
5.7.1 测验 58
5.7.2 练习 59
第6章 管理数据库事务 60
6.1 什么是事务 60
6.2 控制事务 61
6.2.1 COMMIT命令 61
6.2.2 ROLLBACK命令 62
6.2.3 SAVEPOINT命令 63
6.2.4 ROLLBACK TO SAVEPOINT命令 64
6.2.5 RELEASE SAVEPOINT命令 65
6.2.6 SET TRANSACTION命令 65
6.3 事务控制与数据库性能 65
6.4 小结 66
6.5 问与答 66
6.6 实践 66
6.6.1 测验 66
6.6.2 练习 67
第三部分 从查询中获得有效的结果
第7章 数据库查询 71
7.1 什么是查询 71
7.2 SELECT语句 71
7.2.1 SELECT语句 72
7.2.2 FROM子句 73
7.2.3 WHERE子句 74
7.2.4 ORDER BY子句 75
7.2.5 大小写敏感性 76
7.3 简单查询的范例 77
7.3.1 统计表里的记录数量 78
7.3.2 从另一个用户表里选择数据 78
7.3.3 使用字段别名 79
7.4 小结 79
7.5 问与答 79
7.6 实践 80
7.6.1 测验 80
7.6.2 练习 80
第8章 使用操作符对数据进行分类 82
8.1 什么是SQL里的操作符 82
8.2 比较操作符 82
8.2.1 相等 83
8.2.2 不等于 83
8.2.3 小于和大于 84
8.2.4 比较操作符的组合 84
8.3 逻辑操作符 85
8.3.1 IS NULL 85
8.3.2 BETWEEN 86
8.3.3 IN 86
8.3.4 LIKE 87
8.3.5 EXISTS 88
8.3.6 ALL、SOME和ANY操作符 88
8.4 连接操作符 89
8.4.1 AND 90
8.4.2 OR 90
8.5 求反操作符 92
8.5.1 不相等 92
8.5.2 NOT BETWEEN 92
8.5.3 NOT IN 93
8.5.4 NOT LIKE 93
8.5.5 IS NOT NULL 94
8.5.6 NOT EXISTS 94
8.6 算术操作符 94
8.6.1 加法 95
8.6.2 减法 95
8.6.3 乘法 95
8.6.4 除法 96
8.6.5 算术操作符的组合 96
8.7 小结 97
8.8 问与答 97
8.9 实践 97
8.9.1 测验 97
8.9.2 练习 98
第9章 汇总查询得到的数据 100
9.1 什么是汇总函数 100
9.1.1 COUNT函数 101
9.1.2 SUM函数 103
9.1.3 AVG函数 103
9.1.4 MAX函数 104
9.1.5 MIN函数 105
9.2 小结 105
9.3 问与答 106
9.4 实践 106
9.4.1 测验 106
9.4.2 练习 107
第10章 数据排序与分组 108
10.1 为什么要对数据进行分组 108
10.2 GROUP BY子句 109
10.2.1 分组函数 109
10.2.2 对选中的数据进行分组 109
10.2.3 创建分组和使用汇总函数 109
10.2.4 以整数代表字段名称 112
10.3 GROUP BY与ORDER BY 112
10.4 HAVING子句 114
10.5 小结 115
10.6 问与答 115
10.7 实践 115
10.7.1 测验 115
10.7.2 练习 116
第11章 调整数据的外观 117
11.1 ANSI字符函数 117
11.1.1 串接 117
11.1.2 子串 118
11.1.3 TRANSLATE 118
11.2 常用字符函数 118
11.2.1 串接 118
11.2.2 TRANSLATE 119
11.2.3 REPLACE 120
11.2.4 UPPER 120
11.2.5 LOWER 120
11.2.6 SUBSTR 121
11.2.7 INSTR 122
11.2.8 LTRIM 122
11.2.9 RTRIM 123
11.2.10 DECODE 123
11.3 其他字符函数 124
11.3.1 LENGTH 124
11.3.2 IFNULL(检查NULL值) 124
11.3.3 COALESCE 125
11.3.4 LPAD 125
11.3.5 RPAD 126
11.3.6 ASCII 126
11.4 算术函数 126
11.5 转换函数 127
11.5.1 字符串转换为数字 127
11.5.2 数字转换为字符串 128
11.6 字符函数的组合使用 128
11.7 小结 129
11.8 问与答 129
11.9 实践 130
11.9.1 测验 130
11.9.2 练习 130
第12章 日期和时间 132
12.1 日期是如何存储的 132
12.1.1 日期和时间的标准数据类型 132
12.1.2 DATETIME元素 133
12.1.3 不同实现的日期类型 133
12.2 日期函数 134
12.2.1 当前日期 134
12.2.2 时区 134
12.2.3 时间与日期相加 135
12.2.4 比较日期和时间间隔 136
12.2.5 其他日期函数 137
12.3 日期转换 137
12.3.1 日期描述 138
12.3.2 日期转换为字符串 140
12.3.3 字符串转换为日期 140
12.4 小结 141
12.5 问与答 141
12.6 实践 141
12.6.1 测验 141
12.6.2 练习 141
第四部分 建立复杂的数据库查询
第13章 在查询里结合表 145
13.1 从多个表获取数据 145
13.2 结合的类型 146
13.2.1 结合条件的位置 146
13.2.2 等值结合 146
13.2.3 自然结合 147
13.2.4 使用表的别名 148
13.2.5 不等值结合 149
13.2.6 外部结合 150
13.2.7 自结合 151
13.2.8 结合多个主键 152
13.3 需要考虑的事项 153
13.3.1 使用基表 153
13.3.2 笛卡尔积 154
13.4 小结 155
13.5 问与答 156
13.6 实践 156
13.6.1 测验 156
13.6.2 练习 157
第14章 使用子查询定义未确定数据 158
14.1 什么是子查询 158
14.1.1 子查询与SELECT语句 159
14.1.2 子查询与INSERT语句 160
14.1.3 子查询与UPDATE语句 161
14.1.4 子查询与DELETE语句 162
14.2 嵌套的子查询 162
14.3 关联子查询 164
14.4 小结 164
14.5 问与答 165
14.6 实践 165
14.6.1 测验 165
14.6.2 练习 166
第15章 组合多个查询 168
15.1 单查询与组合查询 168
15.2 组合查询操作符 169
15.2.1 UNION 169
15.2.2 UNION ALL 171
15.2.3 INTERSECT 172
15.2.4 EXCEPT 172
15.3 组合查询里使用ORDER BY 173
15.4 组合查询里使用GROUP BY 174
15.5 获取准确的数据 175
15.6 小结 176
15.7 问与答 176
15.8 实践 176
15.8.1 测验 177
15.8.2 练习 178
第五部分 SQL性能调整
第16章 利用索引改善性能 181
16.1 什么是索引 181
16.2 索引是如何工作的 182
16.3 CREATE INDEX命令 182
16.4 索引的类型 183
16.4.1 单字段索引 183
16.4.2 惟一索引 183
16.4.3 组合索引 184
16.4.4 隐含索引 184
16.5 何时考虑使用索引 184
16.6 何时应该避免使用索引 185
16.7 删除索引 186
16.8 小结 186
16.9 问与答 186
16.10 实践 187
16.10.1 测验 187
16.10.2 练习 187
第17章 改善数据库性能 188
17.1 什么是SQL语句调整 188
17.2 数据库调整与SQL语句调整 189
17.3 格式化SQL语句 189
17.3.1 为提高可读性格式化SQL语句 189
17.3.2 FROM子句里的表 191
17.3.3 结合条件的次序 191
17.3.4 最严格条件 191
17.4 全表扫描 192
17.5 其他性能考虑 193
17.5.1 使用LIKE操作符和通配符 193
17.5.2 避免使用OR操作符 194
17.5.3 避免使用HAVING子句 195
17.5.4 避免大规模排序操作 195
17.5.5 使用存储过程 195
17.5.6 在批加载时关闭索引 195
17.6 性能工具 196
17.7 小结 196
17.8 问与答 196
17.9 实践 197
17.9.1 测验 197
17.9.2 练习 197
第六部分 使用SQL管理用户和安全
第18章 管理数据库用户 201
18.1 用户就是原因 202
18.1.1 用户的类型 202
18.1.2 谁管理用户 202
18.1.3 用户在数据库里的位置 203
18.1.4 不同规划里的用户 203
18.2 管理过程 203
18.2.1 创建用户 204
18.2.2 创建规划 205
18.2.3 删除规划 206
18.2.4 调整用户 207
18.2.5 用户会话 207
18.2.6 禁止用户访问 208
18.3 数据库用户使用的工具 208
18.4 小结 208
18.5 问与答 209
18.6 实践 209
18.6.1 测验 209
18.6.2 练习 209
第19章 管理数据库安全 211
19.1 什么是数据库安全 211
19.2 什么是权限 212
19.2.1 系统权限 212
19.2.2 对象权限 213
19.2.3 谁负责授予和撤消权限 214
19.3 控制用户访问 214
19.3.1 GRANT命令 215
19.3.2 REVOKE命令 216
19.3.3 控制对单独字段的访问 216
19.3.4 数据库账户PUBLIC 216
19.3.5 权限组 217
19.4 通过角色控制权限 217
19.4.1 CREATE ROLE语句 218
19.4.2 DROP ROLE语句 218
19.4.3 SET ROLE语句 218
19.5 小结 218
19.6 问与答 219
19.7 实践 219
19.7.1 测验 219
19.7.2 练习 220
第七部分 摘要数据结构
第20章 创建和使用视图及异名 223
20.1 什么是视图 223
20.1.1 使用视图来简化数据访问 224
20.1.2 使用视图作为一种安全形式 224
20.1.3 使用视图维护摘要数据 225
20.2 创建视图 225
20.2.1 从一个表创建视图 225
20.2.2 从多个表创建视图 227
20.2.3 从视图创建视图 227
20.3 WITH CHECK OPTION 228
20.4 通过视图更新数据 229
20.4.1 在视图里插入记录 229
20.4.2 从视图里删除记录 229
20.5 从视图创建表 229
20.6 视图与ORDER BY子句 230
20.7 删除视图 230
20.8 什么是异名 231
20.8.1 创建异名 231
20.8.2 删除异名 232
20.9 小结 232
20.10 问与答 232
20.11 实践 233
20.11.1 测验 233
20.11.2 练习 233
第21章 使用系统目录 234
21.1 什么是系统目录 234
21.2 如何创建系统目录 235
21.3 系统目录里包含什么内容 235
21.3.1 用户数据 236
21.3.2 安全信息 236
21.3.3 数据库设计信息 236
21.3.4 性能统计 236
21.4 不同实现里的系统目录表格 237
21.5 查询系统目录 238
21.6 更新系统目录对象 239
21.7 小结 240
21.8 问与答 240
21.9 实践 241
21.9.1 测验 241
21.9.2 练习 241
第八部分 在实际工作中应用SQL知识
第22章 高级SQL主题 245
22.1 光标 245
22.1.1 打开光标 246
22.1.2 从光标获取数据 246
22.1.3 关闭光标 247
22.2 存储过程和函数 247
22.3 触发器 249
22.3.1 CREATE TRIGGER语句 249
22.3.2 DROP TRIGGER语句 250
22.3.3 FOR EACH ROW语句 251
22.4 动态SQL 251
22.5 调用级接口 251
22.6 使用SQL生成SQL 252
22.7 直接SQL与嵌入SQL 252
22.8 窗口表格函数 253
22.9 使用XML 253
22.10 小结 253
22.11 问与答 254
22.12 实践 254
22.12.1 测验 254
22.12.2 练习 255
第23章 SQL扩展到企业、互联网和内部网 256
23.1 SQL与企业 256
23.1.1 后台程序 256
23.1.2 前台程序 257
23.2 访问远程数据库 258
23.2.1 ODBC 258
23.2.2 JDBC 258
23.2.3 厂商连接产品 259
23.2.4 通过Web接口访问远程数据库 259
23.3 SQL与互联网 260
23.3.1 让数据可以被全世界的顾客使用 260
23.3.2 向雇员和授权顾客提供数据 260
23.3.3 使用SQL的前台Web工具 260
23.4 SQL与内部网 260
23.5 小结 261
23.6 问与答 261
23.7 实践 261
23.7.1 测验 262
23.7.2 练习 262
第24章 标准SQL的扩展 263
24.1 各种实现 263
24.1.1 不同实现之间的区别 263
24.1.2 遵循ANSI SQL 264
24.1.3 SQL的扩展 265
24.2 扩展范例 265
24.2.1 Transact-SQL 266
24.2.2 PL/SQL 266
24.2.3 MySQL 267
24.3 交互SQL语句 267
24.4 小结 268
24.5 问与答 268
24.6 实践 269
24.6.1 测验 269
24.6.2 练习 269
第九部分 附录
附录A 常用SQL命令 273
A.1 SQL语句 273
A.2 SQL子句 276
附录B 使用MySQL进行练习 278
B.1 Windows安装指令 278
B.2 Linux安装指令 279
附录C 测验和练习的答案 280
附录D 本书范例的CREATE TABLE语句 314
D.1 EMPLOYEE_TBL 314
D.2 EMPLOYEE_PAY_TBL 314
D.3 CUSTOMER_TBL 314
D.4 ORDERS_TBL 315
D.5 PRODUCTS_TBL 315
附录E 书中范例的INSERT语句 316
E.1 EMPLOYEE_TBL 316
E.2 EMPLOYEE_PAY_TBL 316
E.3 CUSTOMER_TBL 317
E.4 ORDERS_TBL 318
E.5 PRODUCTS_TBL 318
附录F 额外练习 320
术语表 325