基础篇 2
第1章 SQL简介 2
1.1 SQL的历史起源 2
1.1.1 CODASYL 3
1.1.2 IMS 3
1.1.3 RDBMS和SQL 3
1.1.4 ANSI和SQL方言 5
1.2 SQL的理论基础 5
1.2.1 集合理论 5
1.2.2 谓词逻辑 6
1.2.3 关系模型 7
1.3 Transact-SQL语言的类型 10
1.3.1 DDL语句 11
1.3.2 DML语句 12
1.3.3 编程和流控制语句 12
1.3.4 SQL语句的批处理 15
1.4 Transact-SQL语法 16
1.4.1 标识符 16
1.4.2 数据类型 17
1.4.3 函数 20
1.4.4 表达式 20
1.4.5 运算符 21
1.4.6 注释 21
1.4.7 保留关键字 22
1.5 常量和变量 22
1.5.1 常量 22
1.5.2 变量 24
1.6 运算符 26
1.6.1 算术运算符 26
1.6.2 赋值运算符 28
1.6.3 位运算符 28
1.6.4 比较运算符 29
1.6.5 逻辑运算符 30
1.6.6 字符串串联运算符 31
1.6.7 一元运算符 31
1.7 常用函数 31
1.7.1 聚合函数 31
1.7.2 配置函数 33
1.7.3 游标函数 34
1.7.4 日期和时间函数 35
1.7.5 数学函数 37
1.7.6 数据类型转换函数 39
1.7.7 字符串函数 43
1.7.8 文本和图像函数 45
1.7.9 逻辑函数 46
1.8 查询工具 46
1.8.1 Management Studio 46
1.8.2 sqlcmd 47
1.9 SQL书写规范 48
1.9.1 大小写规范 49
1.9.2 使用空格 50
1.9.3 使用缩进 51
1.9.4 使用垂直空白道 51
1.9.5 使用分组 52
第2章 数据库与架构 53
2.1 SQL Server数据库基础 53
2.1.1 数据库的服务方式 53
2.1.2 数据库实例 54
2.1.3 架构与对象 55
2.1.4 数据库文件和文件组 56
2.2 创建数据库 58
2.2.1 CREATE DATABASE语句的语法格式 58
2.2.2 创建数据库示例 60
2.2.3 判断数据库是否已经存在 63
2.3 修改数据库 63
2.3.1 扩展数据库和文件 63
2.3.2 向数据库中添加、删除和修改文件组 64
2.3.3 收缩数据库和文件 65
2.3.4 设置数据库选项 68
2.3.5 重命名数据库 71
2.4 删除数据库 71
2.5 架构管理 72
2.5.1 创建架构 72
2.5.2 修改架构 74
2.5.3 移动对象到一个新架构中 75
2.5.4 删除架构 76
第3章 表管理 77
3.1 表的物理存储方式 77
3.1.1 数据页 77
3.1.2 区 78
3.2 创建表 79
3.2.1 创建基本表 79
3.2.2 使用NULL约束 79
3.2.3 使用默认约束和标识列 80
3.2.4 其他数据完整性设置 86
3.3 修改表 88
3.3.1 为表添加新列 89
3.3.2 修改表中的列 89
3.3.3 删除表中的列 91
3.4 重命名和删除表 91
3.5 临时表 92
3.5.1 本地表和全局表 92
3.5.2 表变量 93
3.6 内存优化表 93
第4章 索引管理 95
4.1 索引的基础知识 95
4.1.1 索引的类型 95
4.1.2 索引的特征 99
4.1.3 常规索引设计规则 99
4.2 创建索引 101
4.2.1 最大索引限制 101
4.2.2 限制索引参与的数据类型 101
4.2.3 创建聚集索引 102
4.2.4 创建非聚集索引 103
4.2.5 创建具有包含性列的索引 104
4.2.6 为计算列创建索引 105
4.3 修改索引 107
4.3.1 禁用索引 107
4.3.2 重新组织和重新生成索引 108
4.3.3 设置索引选项 110
4.3.4 重命名索引 111
4.4 删除索引 111
第5章 基本查询 112
5.1 基本的SELECT语句 112
5.1.1 SELECT语句的结构 112
5.1.2 数据库对象的引用规则 114
5.2 使用选择列表和表别名 115
5.2.1 选择所有列 115
5.2.2 选择特定列 115
5.2.3 使用常量、函数和表达式 116
5.2.4 用表别名 121
5.3 使用WHERE子句筛选行 121
5.3.1 用比较搜索条件 121
5.3.2 使用范围搜索条件 123
5.3.3 使用列表搜索条件 123
5.3.4 使用模式匹配搜索条件 125
5.3.5 使用NULL比较搜索条件 127
5.4 使用GROUP BY子句进行分组计算 129
5.5 使用HAVING子句从中间结果筛选行 131
5.6 使用ORDER BY子句进行排序 132
5.6.1 指定排序列 132
5.6.2 指定排序顺序 133
5.6.3 指定排序规则 134
5.7 使用TOP和OFFSET-FETCH限制结果集 137
5.7.1 使用TOP选项 137
5.7.2 使用OFFSET-FETCH筛选 139
5.7.3 使用SET ROWCOUNT语句 140
5.8 使用DISTINCT消除重复行 140
5.9 同时操作 142
5.10 查询的逻辑处理 143
5.10.1 逻辑处理过程简介 143
5.10.2 步骤1:FROM 147
5.10.3 步骤2:使用WHERE筛选器 151
5.10.4 步骤3:数据分组 153
5.10.5 步骤4:使用HAVING筛选器 154
5.10.6 步骤5:处理SELECT列表 154
5.10.7 步骤6:使用ORDER BY子句 155
5.10.8 步骤7:使用TOP或OFFSET/FETCH 156
第6章 子查询 157
6.1 在选择列表中使用子查询 157
6.1.1 子查询示例 157
6.1.2 子查询与联接的关系 159
6.2 含有IN和EXISTS的子查询 159
6.2.1 含有IN的子查询 159
6.2.2 含有EXISTS的子查询 161
6.2.3 含有NOTIN和NOT EXISTS的子查询 162
6.3 含有比较运算符的子查询 164
6.4 使用ANY、SOME或ALL关键字 165
6.5 使用多层嵌套子查询 168
6.6 子查询应遵循的规则 168
第7章 联接和APPLY运算符 172
7.1 联接的基本知识 172
7.1.1 联接的语法格式 172
7.1.2 联接所使用的逻辑处理阶段 173
7.1.3 列名限定和选择列表的使用 174
7.1.4 联接条件设定 175
7.2 交叉联接 175
7.2.1 交叉联接的语法格式 176
7.2.2 使用交叉联接查询全部数据 176
7.2.3 使用交叉联接优化查询性能 179
7.2.4 为交叉联接添加WHERE子句 180
7.3 内部联接 181
7.3.1 内部联接的语法格式 181
7.3.2 等值内部联接 182
7.3.3 不等值联接 184
7.4 外部联接 186
7.4.1 外部联接的语法格式 186
7.4.2 左外部联接 187
7.4.3 右外部联接 190
7.4.4 完全外部联接 191
7.5 自联接 192
7.5.1 使用不同列实现自联接 192
7.5.2 使用同一列实现自联接 193
7.6 多表联接 194
7.6.1 顺序联接 194
7.6.2 嵌套联接 196
7.6.3 指定联接的物理顺序 198
7.6.4 多表联接示例 199
7.7 联接算法 202
7.7.1 嵌套循环联接 202
7.7.2 合并联接 203
7.7.3 哈希联接 204
7.7.4 使用联接提示强制联接策略 206
7.8 使用APPLY运算符 208
第8章 操作结果集 211
8.1 合并结果集 211
8.1.1 UNION与UNION ALL 212
8.1.2 使用ORDER BY子句 213
8.1.3 结果集的合并顺序 214
8.2 查询结果集的差异行 214
8.2.1 使用EXCEPT运算符 214
8.2.2 查询全部差异行 216
8.3 查询结果集的相同行 218
8.3.1 使用INTERSECT运算符 218
8.3.2 查询全部相同行 218
8.4 UNION、EXCEPT和INTERSECT的执行顺序 219
8.5 在其他语句中使用UNION、EXCEPT和INTERSECT 221
8.5.1 在结果集操作中使用INTO子句 221
8.5.2 突破结果集操作的限制 222
8.6 使用公用表表达式 223
8.6.1 CTE的语法结构 223
8.6.2 多个CTE定义和CTE的多次引用 226
8.6.3 CTE的间接嵌套 228
8.6.4 使用递归CTE 228
8.7 汇总数据 236
8.7.1 使用CUBE汇总数据 236
8.7.2 使用ROLLUP汇总数据 238
8.7.3 区分空值和汇总值 238
8.7.4 返回指定维度的汇总 239
第9章 窗口计算和表旋转 242
9.1 窗口和开窗函数简介 242
9.2 基于窗口的聚合计算 245
9.2.1 窗口的分区 245
9.2.2 窗口的排序与框架 248
9.2.3 开窗聚合函数的嵌套 253
9.2.4 分区聚合计算与联接的比较 255
9.3 基于窗口的排名计算 256
9.3.1 ROW NUMBER函数 256
9.3.2 RANK和DENSE RANK函数 258
9.3.3 NTILE函数 259
9.4 基于窗口的分布计算 261
9.4.1 PERCENT_RANK函数 261
9.4.2 CUME_DIST函数 262
9.4.3 PERCENTILE_CONT和PERCENTILE_DISC函数 263
9.5 基于窗口偏移计算 264
9.5.1 LAG和LEAD函数 264
9.5.2 FIRST_VALUE和LAST_VALUE函数 265
9.6 表旋转 267
9.6.1 PIVOT运算符 267
9.6.2 UNPIVOT运算符 271
第10章 数据修改 273
10.1 插入数据 273
10.1.1 使用INSERT和VALUES插入行 273
10.1.2 使用INSERT和SELECT子查询插入行 275
10.1.3 使用INSERT和EXEC插入行 275
10.1.4 使用SELECT INTO插入行 276
10.1.5 使用BULK INSERT从文件插入行 277
10.2 更新数据 278
10.2.1 使用SET和WHERE子句更新数据 278
10.2.2 使用FROM子句更新数据 279
10.2.3 使用CTE和视图更新数据 280
10.3 删除数据 281
10.3.1 使用DELETE删除行 281
10.3.2 使用TRUNCATE TABLE删除所有行 282
10.4 合并数据 283
10.5 使用TOP和OFFSET-FETCH限制修改 286
10.5.1 限制插入数据 286
10.5.2 限制更新数据 287
10.5.3 限制删除数据 288
10.6 使用OUTPUT输出受影响行的信息 288
10.6.1 INSERT与OUTPUT 289
10.6.2 DELETE与OUTPUT 290
10.6.3 UPDATE与OUTPUT 291
10.6.4 MERGE与OUTPUT 292
开发篇 295
第11章 视图 295
11.1 创建视图 295
11.1.1 创建简单视图 295
11.1.2 创建索引视图 296
11.1.3 创建分区视图 297
11.2 修改视图 297
11.3 更新视图中的数据 299
11.4 删除和重命名视图 302
第12章 游标 303
12.1 创建游标的步骤 303
12.2 快速只进游标和可滚动游标 306
12.3 静态游标、动态游标和由键集驱动的游标 308
12.4 使用可更新游标进行数据更新 309
第13章 存储过程 311
13.1 存储过程的类型 311
13.1.1 用户定义的存储过程 311
13.1.2 扩展存储过程 312
13.1.3 系统存储过程 312
13.2 SQL存储过程 312
13.2.1 创建存储过程 312
13.2.2 修改存储过程 317
13.2.3 存储过程的重新编译 318
13.2.4 存储过程的错误处理 319
13.3 CLR存储过程 327
13.3.1 创建一个具有输出参数的CLR存储过程 327
13.3.2 创建返回行集和信息的CLR存储过程 333
13.3.3 删除CLR存储过程和程序集 335
13.3.4 CLR与SQL存储过程的择取建议 336
13.4 嵌套存储过程 337
第14章 触发器 339
14.1 DML触发器 339
14.1.1 AFTER触发器 339
14.1.2 进行事务提交和回滚操作 341
14.1.3 检测对指定列的UPDATE或INSERT操作 343
14.1.4 指定First和Last触发器 346
14.1.5 嵌套和递归触发器 347
14.1.6 INSTEAD OF触发器 350
14.2 使用DDL触发器 354
14.2.1 激发DDL触发器的DDL事件和事件组 354
14.2.2 创建DDL触发器 357
14.3 CLR触发器 360
14.3.1 SqlTriggerContext类 360
14.3.2 创建CLR DML触发器的步骤 363
14.3.3 创建CLR DDL触发器的步骤 369
14.4 修改、删除和禁用触发器 371
14.4.1 DML触发器 371
14.4.2 DDL触发器 372
14.4.3 CLR触发器 372
第15章 用户自定义函数 374
15.1 标量UDF 375
15.2 表值UDF 376
15.2.1 使用内联式表值UDF实现参数化视图功能 376
15.2.2 使用多语句式表值UDF进行复杂计算 377
15.3 CLR UDF 379
15.3.1 标量UDF 379
15.3.2 表值UDF 382
15.3.3 聚合UDF 384
15.4 修改和删除UDF 388
性能调整篇 391
第16章 事务处理 391
16.1 自动事务处理 391
16.2 显式事务处理 392
16.3 隐式事务处理 393
16.4 使用嵌套事务 394
16.5 使用事务保存点 397
第17章 并发访问控制 399
17.1 并发影响和并发控制类型 399
17.1.1 并发影响 399
17.1.2 并发控制 400
17.2 锁管理器的数据锁定 400
17.2.1 锁的粒度和层次结构 401
17.2.2 锁的模式 402
17.2.3 锁的兼容性 404
17.2.4 锁升级 404
17.3 自定义锁定 406
17.3.1 自定义锁的超时时间 406
17.3.2 使用表级锁提示 407
17.4 使用事务隔离级别 408
17.5 使用行版本的事务隔离级别 410
17.5.1 快照隔离和行版本控制的工作原理 410
17.5.2 使用基于行版本控制的隔离级别 411
17.6 处理死锁 414
17.6.1 防止死锁的方法 415
17.6.2 使用TRY...CATCH处理死锁 415
第18章 查询的优化与执行 418
18.1 查询的优化 418
18.1.1 查询计划定义的内容 418
18.1.2 生成查询计划 420
18.2 执行计划的缓存与执行 422
18.2.1 执行计划的副本和执行上下文 422
18.2.2 执行计划的开销管理 423
18.3 执行计划的重用 423
18.3.1 通过简单参数化提高计划重用率 424
18.3.2 通过强制参数化提高计划重用率 424
18.3.3 使用显式参数化提高计划重用率 426
18.4 执行计划的重新编译 426
实战篇 430
第19章 SQL查询演练 430
19.1 同一时间范围内并发数统计 430
19.1.1 使用子查询 431
19.1.2 使用CTE 432
19.1.3 使用窗口函数 433
19.2 时间段天数统计 435
19.3 数字范围统计 436
19.3.1 查找剩余空位区间和剩余空位编号 437
19.3.2 查找已用货位区间 439
19.4 地域范围内最大数统计 440
19.5 从分组中取前几行数据 441
19.5.1 使用联接获取前几行 442
19.5.2 使用窗口排名函数获取前几行 443
19.6 取出多列中的非空值 444
19.6.1 姓名问题处理 445
19.6.2 工资问题处理 446
19.7 将数据由行转换为列 447
19.8 层次结构操作 448
19.8.1 检索祖先节点 450
19.8.2 检索子树节点 451
19.8.3 插入新节点 451
19.8.4 变更节点位置 453
19.8.5 hierarchyid的索引策略 455