第1章 简介 1
1.1 关系数据库简介 1
1.2 SQL简介 2
1.3 使用SQL*Plus 4
1.3.1 启动SQL*Plus 4
1.3.2 从命令行启动SQL*Plus 4
1.3.3 使用SQL*Plus执行SELECT语句 5
1.4 使用SQL Developer 6
1.5 创建store模式 8
1.5.1 检查脚本 8
1.5.2 运行脚本 10
1.5.3 用来创建store模式的DDL语句 11
1.6 添加、修改和删除行 17
1.6.1 向表中添加行 17
1.6.2 修改表中的现有行 19
1.6.3 从表中删除行 20
1.7 连接数据库和断开连接 20
1.8 退出SQL*Plus 20
1.9 Oracle PL/SQL简介 21
1.10 小结 22
第2章 从数据库表中检索信息 23
2.1 对单表执行SELECT语句 24
2.2 选择一个表中的所有列 24
2.3 使用WHERE子句限定行 25
2.4 行标识符 25
2.5 行号 26
2.6 执行算术运算 26
2.6.1 执行日期运算 27
2.6.2 列运算 28
2.6.3 算术运算操作符的优先级 29
2.7 使用列别名 29
2.8 使用连接操作合并列的输出结果 30
2.9 空值 31
2.10 禁止显示重复行 32
2.11 比较值 33
2.11.1 使用不等于操作符 33
2.11.2 使用大于操作符 34
2.11.3 使用小于或等于操作符 34
2.11.4 使用ANY操作符 34
2.11.5 使用ALL操作符 35
2.12 使用SQL操作符 35
2.12.1 使用LIKE操作符 36
2.12.2 使用IN操作符 37
2.12.3 使用BETWEEN操作符 38
2.13 使用逻辑操作符 38
2.13.1 使用AND操作符 38
2.13.2 使用OR操作符 39
2.14 逻辑操作符的优先级 39
2.15 使用ORDER BY子句对行进行排序 40
2.16 执行使用两个表的SELECT语句 41
2.17 使用表别名 43
2.18 笛卡尔积 43
2.19 执行使用多于两个表的SELECT语句 44
2.20 连接条件和连接类型 45
2.20.1 不等连接 46
2.20.2 外连接 46
2.20.3 自连接 50
2.21 使用SQL/92语法执行连接 51
2.21.1 使用SQL/92标准语法执行两个表的内连接 51
2.21.2 使用USING关键字简化连接 51
2.21.3 使用SQL/92执行多于两个表的内连接 52
2.21.4 使用SQL/92执行多列的内连接 53
2.21.5 使用SQL/92执行外连接 53
2.21.6 使用SQL/92执行自连接 55
2.21.7 使用SQL/92执行交叉连接 55
2.22 小结 55
第3章 使用SQL*Plus 57
3.1 查看表的结构 58
3.2 编辑SQL语句 58
3.3 保存、检索并运行文件 60
3.4 格式化列 63
3.5 设置页面大小 65
3.6 设置行大小 66
3.7 清除列的格式 67
3.8 使用变量 67
3.8.1 临时变量 67
3.8.2 已定义变量 70
3.9 创建简单报表 73
3.9.1 在脚本中使用临时变量 73
3.9.2 在脚本中使用已定义变量 73
3.9.3 向脚本中的变量传递值 74
3.9.4 添加页眉和页脚 75
3.9.5 计算小计 76
3.10 从SQL*Plus获取帮助信息 78
3.11 自动生成SQL语句 79
3.12 断开数据库连接并退出SQL*Plus 79
3.13 小结 79
第4章 使用简单函数 81
4.1 使用单行函数 82
4.1.1 字符函数 82
4.1.2 数值函数 91
4.1.3 转换函数 96
4.1.4 正则表达式函数 106
4.2 使用聚合函数 112
4.2.1 AVG() 113
4.2.2 COUNT() 114
4.2.3 MAX()和MIN() 114
4.2.4 STDDEV() 115
4.2.5 SUM() 115
4.2.6 VARIANCE() 115
4.3 对行进行分组 116
4.3.1 使用GROUP BY子句对行进行分组 116
4.3.2 调用聚合函数的错误用法 119
4.3.3 使用HAVING子句过滤行组 120
4.3.4 组合使用WHERE和GROUP BY子句 120
4.3.5 组合使用WHERE、GROUP BY和HAVING子句 121
4.4 小结 122
第5章 日期和时间的存储与处理 123
5.1 几个简单的存储和检索日期的例子 123
5.2 使用TO_CHAR()和TO_DATE()转换时间值 125
5.2.1 使用TO_CHAR()将时间值转换为字符串 125
5.2.2 使用TO_DATE()将字符串转换为时间值 130
5.3 设置默认的日期格式 132
5.4 Oracle对两位年份的处理 133
5.4.1 使用YY格式 133
5.4.2 使用RR格式 134
5.5 使用时间值函数 135
5.5.1 ADD_MONTHS() 136
5.5.2 LAST_DAY() 137
5.5.3 MONTHS_BETWEEN() 137
5.5.4 NEXT_DAY() 138
5.5.5 ROUND() 138
5.5.6 SYSDATE 139
5.5.7 TRUNC() 139
5.6 使用时区 140
5.6.1 与时区有关的函数 140
5.6.2 数据库时区和会话时区 141
5.6.3 获取时区的时差 142
5.6.4 获取时区名 142
5.6.5 将时间值从一个时区转换为另一个时区 143
5.7 使用时间戳 143
5.7.1 使用时间戳类型 143
5.7.2 与时间戳有关的函数 147
5.8 使用时间间隔 152
5.8.1 使用INTERVAL YEAR TO MONTH类型 153
5.8.2 使用INTERVAL DAY TO SECOND类型 155
5.8.3 与时间间隔有关的函数 157
5.9 小结 158
第6章 子查询 159
6.1 子查询的类型 159
6.2 编写单行子查询 160
6.2.1 在WHERE子句中使用子查询 160
6.2.2 使用其他单行操作符 161
6.2.3 在HAVING子句中使用子查询 161
6.2.4 在FROM子句中使用子查询(内联视图) 162
6.2.5 可能碰到的错误 163
6.3 编写多行子查询 164
6.3.1 在多行子查询中使用IN操作符 165
6.3.2 在多行子查询中使用ANY操作符 165
6.3.3 在多行子查询中使用ALL操作符 166
6.4 编写多列子查询 166
6.5 编写关联子查询 167
6.5.1 关联子查询的例子 167
6.5.2 在关联子查询中使用EXISTS和NOT EXISTS 168
6.6 编写嵌套子查询 170
6.7 编写包含子查询的UPDATE和DELETE语句 172
6.7.1 编写包含子查询的UPDATE语句 172
6.7.2 编写包含子查询的DELETE语句 172
6.8 使用子查询因子化 173
6.9 小结 174
第7章 高级查询 175
7.1 使用集合操作符 176
7.1.1 示例表 176
7.1.2 使用UNION ALL操作符 177
7.1.3 使用UNION操作符 178
7.1.4 使用INTERSECT操作符 179
7.1.5 使用MINUS操作符 179
7.1.6 组合使用集合操作符 180
7.2 使用TRANSLATE()函数 182
7.3 使用DECODE()函数 183
7.4 使用CASE表达式 185
7.4.1 使用简单CASE表达式 185
7.4.2 使用搜索CASE表达式 186
7.5 层次化查询 187
7.5.1 示例数据 187
7.5.2 使用CONNECT BY和START WITH子句 189
7.5.3 使用伪列LEVEL 190
7.5.4 格式化层次化查询的结果 190
7.5.5 从非根节点开始遍历191
7.5.6 在START WITH子句中使用子查询 192
7.5.7 从下向上遍历树 192
7.5.8 从层次化查询中删除节点和分支 193
7.5.9 在层次化查询中加入其他条件 194
7.5.10 使用递归子查询因子化查询分层数据 194
7.6 使用ROLLUP和CUBE子句 198
7.6.1 示例表 199
7.6.2 使用ROLLUP子句 200
7.6.3 使用CUBE子句 203
7.6.4 使用GROUPING()函数 204
7.6.5 使用GROUPING SETS子句 207
7.6.6 使用GROUPING_ID()函数 207
7.6.7 在GROUP BY子句中多次使用某个列 209
7.6.8 使用GROUP_ID()函数 210
7.7 使用CROSS APPLY和OUTER APPLY 211
7.7.1 CROSS APPLY 212
7.7.2 OUTER APPLY 212
7.8 使用LATERAL 213
7.9 小结 214
第8章 分析数据 215
8.1 使用分析函数 215
8.1.1 示例表 216
8.1.2 使用评级函数 217
8.1.3 使用反百分位函数 223
8.1.4 使用窗口函数 224
8.1.5 使用报表函数 230
8.1.6 使用LAG()和LEAD()函数 233
8.1.7 使用FIRST和LAST函数 234
8.1.8 使用线性回归函数 234
8.1.9 使用假想评级与分布函数 235
8.2 使用MODEL子句 236
8.2.1 MODEL子句示例 236
8.2.2 用位置标记和符号标记访问数据单元 238
8.2.3 用BETWEEN和AND返回特定范围内的数据单元 239
8.2.4 用ANY和IS ANY访问所有的数据单元 239
8.2.5 用CURRENTV()函数获取某个维度的当前值 239
8.2.6 用FOR循环访问数据单元 240
8.2.7 处理空值和缺失值 242
8.2.8 更新已有的单元 244
8.3 使用PIVOT和UNPIVOT子句 245
8.3.1 PIVOT子句的简单示例 245
8.3.2 转换多个列 246
8.3.3 在转换中使用多个聚合函数 247
8.3.4 使用UNPIVOT子句 248
8.4 执行Top-N查询 249
8.4.1 使用FETCH FIRST子句 250
8.4.2 使用OFFSET子句 250
8.4.3 使用PERCENT子句 251
8.4.4 使用WITH TIES子句 252
8.5 在数据中发现模式 252
8.5.1 在all_sales2表中发现V形数据模式 253
8.5.2 在all_sales3表中发现W型数据模式 256
8.5.3 在all_sales3表中发现V形数据模式 257
8.6 小结 258
第9章 修改表的内容 259
9.1 使用INSERT语句添加行 260
9.1.1 省略列的列表 261
9.1.2 为列指定空值 261
9.1.3 在列值中使用单引号和双引号 261
9.1.4 从一个表向另一个表复制行 262
9.2 使用UPDATE语句修改行 262
9.3 使用RETURNING子句返回聚合函数的计算结果 263
9.4 使用DELETE语句删除行 264
9.5 数据库的完整性 264
9.5.1 主键约束 264
9.5.2 外键约束 265
9.6 使用默认值 266
9.7 使用MERGE合并行 267
9.8 数据库事务 269
9.8.1 事务的提交和回滚 269
9.8.2 事务的开始与结束 270
9.8.3 保存点 271
9.8.4 事务的ACID特性 272
9.8.5 并发事务 273
9.8.6 事务锁 274
9.8.7 事务隔离级别 274
9.8.8 SERIALIZABLE事务隔离级别的一个例子 275
9.9 查询闪回 276
9.9.1 授权使用闪回 276
9.9.2 时间查询闪回 277
9.9.3 SCN查询闪回 278
9.10 小结 280
第10章 用户、特权和角色 281
10.1 用户 282
10.1.1 创建用户 282
10.1.2 修改用户密码 283
10.1.3 删除用户 283
......