基础篇 2
第1章 SQL简介 2
1.1 SQL的历史起源 2
1.1.1 CODASYL 2
1.1.2 IMS 3
1.1.3 RDBMS和SQL 3
1.1.4 ANSI和SQL方言 4
1.2 Transact-SQL语言的类型 5
1.2.1 DDL语句 5
1.2.2 DML语句 6
1.2.3 编程和流控制语句 7
1.2.4 SQL语句的批处理 9
1.3 Transact-SQL语法 10
1.3.1 使用标识符进行对象引用 10
1.3.2 设置对象的数据类型 11
1.3.3 函数 14
1.3.4 使用表达式求值 15
1.3.5 使用运算符进行计算操作 15
1.3.6 使用注释符添加SQL语句说明 15
1.3.7 保留关键字 16
1.4 常量和变量 16
1.4.1 常量的类型 16
1.4.2 变量的类型 18
1.5 运算符 21
1.5.1 使用算术运算符执行数学运算 21
1.5.2 使用赋值运算符为变量赋值 22
1.5.3 使用位运算符执行按位运算 22
1.5.4 使用比较运算符进行大小比较 23
1.5.5 使用逻辑运算符进行条件测试 24
1.5.6 字符串串联运算符 25
1.5.7 一元运算符 25
1.6 常用函数 25
1.6.1 聚合函数 25
1.6.2 配置函数 27
1.6.3 游标函数 28
1.6.4 日期和时间函数 29
1.6.5 数学函数 30
1.6.6 数据类型转换函数 32
1.6.7 字符串函数 35
1.6.8 文本和图像函数 38
1.7 查询工具 38
1.7.1 使用Management Studio进行Windows方式查询 39
1.7.2 使用sqlcmd进行MS-DOS方式查询 39
1.8 SQL书写规范 40
1.8.1 使用大小写规范提高词义识别能力 40
1.8.2 使用空格提供更好的语言标记区分 42
1.8.3 使用缩进提高语句的逻辑层次表达能力 42
1.8.4 使用垂直空白道提高关键词与参数的区分能力 43
1.8.5 使用分组进行语句的段落划分 43
第2章 数据库管理 44
2.1 创建数据库 44
2.1.1 数据库文件和文件组 45
2.1.2 CREATE DATABASE语句的语法格式 46
2.1.3 创建数据库示例 48
2.1.4 判断数据库是否已经存在 50
2.2 修改数据库 51
2.2.1 扩展数据库和文件 51
2.2.2 向数据库中添加、删除和修改文件组 52
2.2.3 收缩数据库和文件 53
2.2.4 设置数据库选项 55
2.2.5 重命名数据库 58
2.3 删除数据库 58
第3章 表管理 59
3.1 表的物理存储方式 59
3.1.1 最基本的数据存储单位:数据页 59
3.1.2 最基本的管理空间单位:区 60
3.2 创建表 61
3.2.1 创建基本表 61
3.2.2 使用允许和禁止空值设置进行值约束 61
3.2.3 使用标识符和全球唯一标识符创建唯一值 62
3.2.4 为列指定默认值 63
3.3 修改表 63
3.3.1 为表添加新列 64
3.3.2 修改表中的列 64
3.3.3 删除表中的列 65
3.4 重命名和删除表 66
3.5 临时表 67
3.5.1 创建本地表和全局表 67
3.5.2 使用表变量代替临时表 68
第4章 索引管理 69
4.1 索引的基础知识 69
4.1.1 索引的类型 69
4.1.2 索引的特征 73
4.1.3 常规索引设计规则 73
4.2 创建索引 75
4.2.1 最大索引限制 75
4.2.2 限制索引参与的数据类型 75
4.2.3 创建聚集索引 76
4.2.4 创建非聚集索引 77
4.2.5 创建具有包含性列的索引 78
4.2.6 为计算列创建索引 79
4.3 修改索引 81
4.3.1 禁用索引 81
4.3.2 重新组织和重新生成索引 82
4.3.3 设置索引选项 84
4.3.4 重命名索引 85
4.4 删除索引 85
第5章 基本查询 86
5.1 基本的SELECT语句 86
5.1.1 SELECT语句的结构 86
5.1.2 数据库对象的引用规则 88
5.2 使用选择列表和表别名 89
5.2.1 选择所有列 89
5.2.2 选择特定列 89
5.2.3 在选择列表中使用常量、函数和表达式 90
5.2.4 使用表别名简化表引用 93
5.3 使用WHERE子句筛选行 94
5.3.1 使用比较搜索条件 94
5.3.2 使用范围搜索条件 95
5.3.3 使用列表搜索条件 95
5.3.4 使用模式匹配搜索条件 97
5.3.5 使用NULL比较搜索条件 99
5.4 使用GROUP BY子句和聚合函数进行分组计算 100
5.5 使用HAVING子句从分组后结果中筛选行 101
5.6 使用ORDER BY子句进行排序 102
5.6.1 指定排序列 102
5.6.2 指定排序顺序 103
5.6.3 指定排序规则 104
5.7 使用TOP子句和SET ROWCOUNT限制结果集 107
5.7.1 使用TOP子句返回前几行 108
5.7.2 使用SET ROWCOUNT语句限制结果集大小 109
5.8 使用DISTINCT消除重复行 109
5.9 查询的逻辑处理 110
5.9.1 逻辑处理过程简介 111
5.9.2 步骤1:使用FROM确定输入表 115
5.9.3 步骤2:使用WHERE筛选数据 119
5.9.4 步骤3:进行数据分组 120
5.9.5 步骤4:使用HAVING筛选数据 122
5.9.6 步骤5:通过SELECT列表确定返回列 122
5.9.7 步骤6:使用ORDERBY子句排序查询结果 123
第6章 子查询 125
6.1 在选择列表中使用子查询 125
6.1.1 子查询示例 125
6.1.2 子查询与联接的关系 126
6.2 含有IN和EXISTS的子查询 127
6.2.1 使用含有IN的子查询进行单列匹配 127
6.2.2 使用含有EXISTS的子查询进行整行匹配 129
6.2.3 含有NOT IN和NOT EXISTS的子查询 130
6.3 使用含有比较运算符的子查询 132
6.4 使用ANY、SOME或ALL关键字进行批量比较 134
6.5 使用多层嵌套子查询 136
6.6 子查询应遵循的规则 136
第7章 联接和APPLY运算符 138
7.1 联接的基本知识 138
7.1.1 联接的语法格式 138
7.1.2 联接所使用的逻辑处理阶段 139
7.1.3 列名限定和选择列表的使用 140
7.1.4 联接条件设定 141
7.2 交叉联接 141
7.2.1 交叉联接的语法格式 142
7.2.2 使用交叉联接查询全部数据 142
7.2.3 使用交叉联接优化查询性能 145
7.2.4 为交叉联接添加WHERE子句 146
7.3 内部联接 147
7.3.1 内部联接的语法格式 147
7.3.2 使用等值进行内部联接 148
7.3.3 使用不等值进行内部联接 150
7.4 外部联接 152
7.4.1 外部联接的语法格式 152
7.4.2 使用左外部联接保留左表全部行 153
7.4.3 使用右外部联接保留右表全部行 156
7.4.4 使用完全外部联接保留两侧表全部行 157
7.5 自联接 158
7.5.1 使用不同列实现自联接 158
7.5.2 使用同一列实现自联接 159
7.6 多表联接 160
7.6.1 顺序联接 160
7.6.2 嵌套联接 161
7.6.3 指定联接的物理顺序 163
7.6.4 多表联接示例 165
7.7 联接算法 167
7.7.1 嵌套循环联接 167
7.7.2 合并联接 168
7.7.3 哈希联接 169
7.7.4 使用联接提示强制联接策略 171
7.8 使用APPLY运算符 173
第8章 操作结果集 176
8.1 合并结果集 176
8.1.1 使用UNION与UNION ALL进行结果集合并 177
8.1.2 使用ORDER BY子句对合并结果集排序 178
8.1.3 结果集的合并顺序 178
8.2 查询结果集的差异行 179
8.2.1 使用EXCEPT运算符 179
8.2.2 查询全部差异行 181
8.3 查询结果集的相同行 182
8.3.1 使用INTERSECT运算符 183
8.3.2 查询全部相同行 183
8.4 UNION、EXCEPT和INTERSECT的执行顺序 184
8.5 在其他语句中使用UNION、EXCEPT和INTERSECT 186
8.5.1 使用INTO子句指定结果存储位置 186
8.5.2 突破结果集操作的限制 186
8.6 使用公用表表达式 188
8.6.1 CTE的语法结构 188
8.6.2 多CTE定义和CTE的多次引用 190
8.6.3 CTE的间接嵌套 192
8.6.4 使用递归CTE返回分层数据 193
8.7 汇总数据 200
8.7.1 使用CUBE汇总数据 200
8.7.2 使用ROLLUP汇总数据 201
8.7.3 区分空值和汇总值 202
8.7.4 返回指定维度的汇总 203
第9章 窗口计算和表旋转 205
9.1 窗口和开窗函数 205
9.2 基于窗口的排名计算 206
9.2.1 使用ROW_NUMBER()实现分区编号 206
9.2.2 使用RANK()和DENSE_RANK()函数实现分区排名 208
9.2.3 使用NTILE()函数实现数据分组 209
9.3 基于窗口的聚合计算 210
9.3.1 分区聚合计算与联接的比较 211
9.3.2 对不同类型分区的聚合计算 212
9.4 表旋转 213
9.4.1 使用PIVOT运算符将表的行转换为列 213
9.4.2 使用UNPIVOT运算符将表的列转换为行 217
第10章 数据修改 219
10.1 插入数据 219
10.1.1 使用INSERT和VALUES插入行 219
10.1.2 使用INSERT和SELECT子查询插入行 221
10.1.3 使用INSERT和EXEC插入行 221
10.1.4 使用SELECTINTO插入行 222
10.2 更新数据 223
10.2.1 使用SET和WHERE子句更新数据 223
10.2.2 使用FROM子句更新数据 224
10.2.3 使用CTE和视图更新数据 226
10.3 删除数据 226
10.3.1 使用DELETE删除行 227
10.3.2 使用TRUNCATE TABLE删除所有行 228
10.4 使用TOP限制数据修改 228
10.4.1 使用TOP限制插入数据 229
10.4.2 使用TOP限制更新数据 229
10.4.3 使用TOP限制删除数据 230
10.5 使用OUTPUT输出受影响行的信息 230
10.5.1 在INSERT中使用OUTPUT子句 230
10.5.2 在DELETE中使用OUTPUT子句 231
10.5.3 在UPDATE中使用OUTPUT子句 233
开发篇 235
第11章 视图 235
11.1 创建视图 235
11.1.1 创建简单视图 235
11.1.2 创建索引视图 236
11.1.3 创建分区视图 237
11.2 修改视图 237
11.3 更新视图中的数据 239
11.4 删除和重命名视图 242
第12章 游标 243
12.1 创建游标的步骤 243
12.2 快速只进游标和可滚动游标 245
12.3 静态游标、动态游标和由键集驱动的游标 248
12.4 使用可更新游标进行数据更新 249
第13章 存储过程 250
13.1 存储过程的类型 250
13.1.1 用户定义的存储过程 250
13.1.2 扩展存储过程 251
13.1.3 系统存储过程 251
13.2 SQL存储过程 251
13.2.1 创建存储过程 251
13.2.2 修改存储过程 256
13.2.3 存储过程的重新编译 256
13.2.4 存储过程的错误处理 258
13.3 CLR存储过程 266
13.3.1 创建一个具有输出参数的CLR存储过程 266
13.3.2 创建返回行集和信息的CLR存储过程 271
13.3.3 删除CLR存储过程和程序集 273
13.3.4 CLR与SQL存储过程的择取建议 274
13.4 嵌套存储过程 275
第14章 触发器 277
14.1 DML触发器 277
14.1.1 AFTER触发器 277
14.1.2 进行事务提交和回滚操作 279
14.1.3 检测对指定列的UPDATE或INSERT操作 281
14.1.4 指定First和Last触发器 284
14.1.5 嵌套和递归触发器 285
14.1.6 INSTEAD OF触发器 288
14.2 使用DDL触发器 292
14.2.1 激发DDL触发器的DDL事件和事件组 292
14.2.2 创建DDL触发器 295
14.3 CLR触发器 298
14.3.1 SqlTriggerContext类 298
14.3.2 创建CLRDML触发器的步骤 301
14.3.3 创建CLRDDL触发器的步骤 305
14.4 修改、删除和禁用触发器 307
14.4.1 DML触发器 307
14.4.2 DDL触发器 308
14.4.3 CLR触发器 309
第15章 用户自定义函数 310
15.1 标量UDF 310
15.2 表值UDF 312
15.2.1 使用内联式表值UDF实现参数化视图功能 312
15.2.2 使用多语句式表值UDF进行复杂计算 313
15.3 CLRUDF 315
15.3.1 标量UDF 315
15.3.2 表值UDF 318
15.3.3 聚合UDF 320
15.4 修改和删除UDF 324
性能调整篇 326
第16章 事务处理 326
16.1 自动事务处理 326
16.2 显式事务处理 327
16.3 隐式事务处理 328
16.4 使用嵌套事务 329
16.5 使用事务保存点 332
第17章 并发访问控制 334
17.1 并发影响和并发控制类型 334
17.1.1 并发影响 334
17.1.2 并发控制 335
17.2 锁管理器的数据锁定 335
17.2.1 锁的粒度和层次结构 336
17.2.2 锁的模式 337
17.2.3 锁的兼容性 339
17.2.4 锁升级 339
17.3 自定义锁定 341
17.3.1 自定义锁的超时时间 341
17.3.2 使用表级锁提示 342
17.4 使用事务隔离级别 343
17.5 使用行版本的事务隔离级别 345
17.5.1 快照隔离和行版本控制的工作原理 345
17.5.2 使用基于行版本控制的隔离级别 346
17.6 处理死锁 349
17.6.1 防止死锁的方法 350
17.6.2 使用TRY...CATCH处理死锁 350
第18章 查询的优化与执行 353
18.1 查询的优化 353
18.1.1 查询计划定义的内容 353
18.1.2 生成查询计划 355
18.2 执行计划的缓存与执行 357
18.2.1 执行计划的副本和执行上下文 357
18.2.2 执行计划的开销管理 358
18.3 执行计划的重用 359
18.3.1 通过简单参数化提高计划重用率 359
18.3.2 通过强制参数化提高计划重用率 359
18.3.3 使用显式参数化提高计划重用率 361
18.4 执行计划的重新编译 361
实战篇 365
第19章 SQL查询演练 365
19.1 同一时间范围内并发数统计 365
19.1.1 使用子查询 366
19.1.2 使用CTE 367
19.2 时间段天数统计 368
19.3 数字范围统计 369
19.3.1 查找剩余空位区间和剩余空位编号 370
19.3.2 查找已用货位区间 372
19.4 地域范围内最大数统计 373
19.5 从分组中取前几行数据 374
19.5.1 使用联接获取前几行 375
19.5.2 使用窗口排名函数获取前几行 376
19.6 取出多列中的非空值 377
19.6.1 姓名问题处理 377
19.6.2 工资问题处理 379
19.7 将数据由行转换为列 380