第1章 关系数据库 1
1.1 关系模型基本概念 1
1.2 E-R模型到关系模型的转化 3
1.3 数据库设计规范 6
1.3.1 第一范式(1NF) 6
1.3.2 第二范式(2NF) 7
1.3.3 第三范式(3NF) 8
第2章 Transact-SQL概述 10
2.1 启动SQL Server Management Studio(SSMS) 10
2.2 T-SQL语句的类型 12
2.2.1 DDL语句 12
2.2.2 DCL语句 13
2.2.3 DML 14
2.3 T-SQL语法要素 16
2.3.1 SQL语句的批处理符号GO 16
2.3.2 EXEC 17
2.3.3 注释符 17
2.3.4 标识符 18
2.4 变量 19
2.5 数据类型 21
2.5.1 字符串类型 21
2.5.2 Unicode字符串类型 23
2.5.3 日期时间类型 23
2.5.4 数值类型 23
2.6 运算符 25
2.6.1 算术运算符 25
2.6.2 比较运算符 25
2.6.3 逻辑运算符 25
2.6.4 连接运算符 26
2.7 常用函数 26
2.7.1 聚合函数 27
2.7.2 数值函数 28
2.7.3 字符串函数 29
2.7.4 日期时间函数 30
2.7.5 数据类型转换函数 31
2.7.6 控制NULL的常用函数 32
2.8 流程控制语句 32
2.8.1 条件判断语句IF...ELSE和CASE 33
2.8.2 循环语句 35
第3章 查询基础 36
3.1 简单查询逻辑处理过程 36
3.2 数据库对象的引用规则 39
3.3 指定表的返回列来筛选列 40
3.4 使用WHERE筛选行 41
3.4.1 使用比较运算符过滤数据 41
3.4.2 搜索范围内的值 41
3.4.3 使用IN指定列表搜索条件 42
3.4.4 使用LIKE关键字进行模糊匹配 42
3.4.5 使用 NULL比较搜索条件 43
3.4.6 筛选时影响性能的注意事项 44
3.5 格式化结果集 44
3.5.1 在选择列表中使用常量、函数和表达式 44
3.5.2 使用别名 45
3.5.3 使用ORDER BY子句对结果排序 46
3.5.4 使用TOP限制结果集 48
3.5.5 使用DISTINCT消除重复行 50
3.6 使用GROUP BY子句和聚集函数进行分组计算 51
3.6.1 在查询中使用聚集函数 51
3.6.2 GROUP BY使用基础 52
3.6.3 使用HAVING子句筛选分组后的数据 53
第4章 多表联接查询和数据汇总 55
4.1 联接基础知识 55
4.1.1 在FROM子句中联接 56
4.1.2 在WHERE子句中联接 56
4.2 交叉联接 57
4.3 内联接 57
4.4 外联接 59
4.4.1 左外联接 59
4.4.2 右外联接 60
4.4.3 完全外部联接 60
4.5 自联接 62
4.5.1 使用同一列进行自联接 62
4.5.2 使用不同列进行自联接 62
4.6 联接查询的逻辑处理过程 64
4.7 多表联接查询 64
4.8 UNION合并结果集 64
4.8.1 UNION和UNION ALL 65
4.8.2 对合并结果集进行排序 66
4.8.3 结果集的合并顺序 66
4.9 汇总数据 67
4.9.1 ROLLUP 67
4.9.2 CUBE 70
4.9.3 使用GROUPING SETS 70
4.9.4 GROUPING查看汇总行并区分NULL 71
第5章 子查询 73
5.1 独立子查询 73
5.1.1 独立标量子查询 74
5.1.2 独立多值子查询 74
5.2 相关子查询 75
5.3 使用IN (NOT IN)和EXISTS (NOT EXISTS)谓词 76
5.3.1 IN和NOT IN 77
5.3.2 EXISTS和NOT EXISTS 77
5.4 表表达式 81
5.4.1 派生表 81
5.4.2 公用表表达式(CTE) 84
第6章 开窗函数和行列转换 89
6.1 窗口和开窗函数 89
6.2 排名窗口函数 90
6.2.1 使用ROW_ NUMBER()进行分区编号 91
6.2.2 使用RANK()和DENSE RANK()进行分区排名 94
6.2.3 使用NTILE()进行数据分组 96
6.3 聚合窗口函数 97
6.4 行列转换 100
6.4.1 行转列 100
6.4.2 列转行 105
第7章 数据修改 109
7.1 插入数据 109
7.1.1 使用INSERT和VALUES插入数据 109
7.1.2 使用SELECTINTO插入数据 110
7.1.3 使用INSERT和SELECT插入数据 111
7.2 删除数据 112
7.2.1 使用DELETE删除行 112
7.2.2 使用TRUNCATE TABLE删除所有行 113
7.3 更新数据 113
7.3.1 使用SET和WHERE更新数据 113
7.3.2 更新基于其他表的数据 113
7.4 使用MERGE合并数据 114
7.5 通过表表达式修改数据 118
第8章 数据完整性 121
8.1 数据完整性的类型和实现方式 121
8.1.1 域完整性及实现方式 122
8.1.2 实体完整性及实现方式 122
8.1.3 参照完整性及实现方式 122
8.2 实现实体完整性 124
8.2.1 使用主键 124
8.2.2 使用UNIQUE约束 127
8.2.3 使用自增列 127
8.3 实现域完整性 131
8.3.1 CHECK约束 131
8.3.2 DEFAULT约束 132
8.3.3 NOT NULL定义 133
8.4 参照完整性 134
8.4.1 实现表间列的参照完整性 134
8.4.2 实现表内列的参照完整性 137
8.5 使用关系图实现参照完整性 138
8.6 使约束失效 141
8.7 使用图形界面实现数据完整性 141
8.7.1 添加主键 141
8.7.2 设置UNIQUE约束 142
8.7.3 设置CHECK约束 142
8.7.4 设置默认值约束 144
8.7.5 设置外键 145
8.7.6 禁用约束 147
第9章 索引 148
9.1 数据的存储方式 149
9.1.1 页(Page) 149
9.1.2 区(Extent) 152
9.1.3 索引分配映射页(IAM页) 152
9.1.4 估算表的大小 153
9.2 B树(Balanced Tree) 154
9.3 查看页内容的工具 156
9.3.1 DBCC IND 156
9.3.2 DBCC PAGE 158
9.4 堆(Heaps) 160
9.5 聚集索引 162
9.5.1 约束与索引的关系 162
9.5.2 唯一聚集索引的物理结构 163
9.5.3 不唯一聚集索引的物理结构 167
9.5.4 使用聚集索引查找数据的执行计划 168
9.6 非聚集索引及其物理结构 169
9.6.1 在堆中的非聚集索引 169
9.6.2 在聚集表中的非聚集索引 172
9.6.3 使用非聚集索引查找数据的执行计划 175
9.7 修改数据对索引结构的影响 176
9.7.1 页拆分和行移动现象 176
9.7.2 插入行 178
9.7.3 删除行 179
9.7.4 更新行 180
9.8 碎片和索引维护 180
9.8.1 碎片 180
9.8.2 维护索引 182
9.9 复合索引 187
9.10 包含列索引 188
9.11 索引交叉 188
9.12 筛选索引 189
9.13 全文搜索 190
9.13.1 创建和修改全文目录 191
9.13.2 创建全文索引 191
9.13.3 全文搜索的查询方法 192
9.14 统计信息 194
9.14.1 了解统计信息的作用 194
9.14.2 查看和分析统计信息 195
9.14.3 创建统计信息 198
9.14.4 更新统计信息 198
9.14.5 同步和异步统计信息更新 200
9.15 基于索引设计的考虑 200
第10章 视图 202
10.1 视图简介 202
10.2 使用标准视图 204
10.2.1 创建标准视图 204
10.2.2 通过视图更新数据 206
10.2.3 修改和删除视图 208
10.3 视图选项 209
10.3.1 使用ENCRYPTION选项 209
10.3.2 使用SCHEMABINDING选项 210
10.3.3 使用CHECK OPTION选项 211
10.4 使用索引视图 212
10.4.1 创建索引视图 213
10.4.2 索引视图的性能 213
10.4.3 更新索引视图 214
10.5 视图的优点 215
第11章 存储过程 216
11.1 存储过程的类型 216
11.1.1 系统存储过程 217
11.1.2 扩展存储过程 217
11.1.3 用户自定义存储过程 217
11.2 SQL存储过程 218
11.2.1 创建无参数的存储过程 218
11.2.2 修改和删除存储过程 220
11.2.3 创建带参数的存储过程 221
11.2.4 获取存储过程的执行结果 223
11.3 存储过程示例分析 224
11.4 存储过程的解析特点 225
11.5 存储过程的编译、重编译 226
11.6 使用存储过程的优缺点 227
第12章 用户自定义函数 229
12.1 UDF简介 229
12.2 标量UDF 230
12.3 内联表值函数 232
12.4 多语句表值函数 233
12.5 UDF的修改和删除 235
12.6 UDF的调用分析 235
第13章 触发器 239
13.1 触发器的概念和分类 239
13.2 DML触发器 240
13.2.1 两张特殊的临时表 240
13.2.2 insert触发器 241
13.2.3 delete触发器 242
13.2.4 update触发器 244
13.2.5 禁用和启用触发器 244
13.2.6 检测基于列修改的触发器 244
13.2.7 FIRST触发器和LAST触发器 245
13.3 使用触发器实现审核跟踪 246
13.4 DML触发器的工作原理和事务控制 246
13.4.1 触发器的工作原理 247
13.4.2 DML触发器的事务控制 248
13.5 DDL触发器 249
13.5.1 创建数据库级别的DDL触发器 249
13.5.2 创建服务器级别的DDL触发器 250
第14章 事务和锁 251
14.1 事务 251
14.1.1 显式事务处理模式 252
14.1.2 自动提交事务模式 253
14.1.3 隐式事务处理模式 253
14.1.4 嵌套事务的控制 254
14.1.5 事务、事务日志和检查点 255
14.2 并发访问引起的问题 257
14.3 锁 260
14.3.1 锁的粒度和锁升级 260
14.3.2 锁的类型和查看锁 261
14.3.3 锁的兼容性 265
14.4 设置事务隔离级别 266
14.4.1 SQL标准定义的4种事务隔离级别 266
14.4.2 行版本的事务隔离级别 271
14.5 隔离级别、锁和并发问题的关系 274
14.6 死锁 275