第1章 數據庫與文件係統 1
1.1 實體錶 3
1.2 關係錶 3
1.3 行與記錄 3
1.4 列與字段 4
1.5 模式對象 5
1.6 CREATE SCHEMA語句 6
第2章 事務與並發控製 8
2.1 會話 8
2.2 事務與ACID 9
2.2.1 原子性 9
2.2.2 一緻性 10
2.2.3 隔離性 10
2.2.4 持久性 10
2.3 並發控製 11
2.3.1 三種現象 11
2.3.2 隔離級彆 12
2.4 保守式並發控製 13
2.5 快照隔離與樂觀式並發 14
2.6 邏輯並發控製 16
2.7 死鎖與活鎖 16
第3章 數據庫模式對象 17
3.1 CREATE SCHEMA語句 17
3.2 CREATE PROCEDURE、CREATE FUNCTION以及CREATE TRIGGER語句 18
3.3 CREATE DOMAIN語句 18
3.4 創建序列 19
3.5 創建斷言 19
3.5.1 為模式級約束使用視圖 20
3.5.2 為約束使用主鍵和斷言 23
3.6 字符集相關結構 25
3.6.1 創建字符集 25
3.6.2 創建排序規則 26
3.6.3 創建翻譯 26
第4章 定位數據和特殊數值 27
4.1 顯式的物理定位器 27
4.1.1 ROWID和物理磁盤地址 27
4.1.2 標識列 27
4.2 生成的標識符 30
4.2.1 GUID 30
4.2.2 UUID 31
4.3 序列生成函數 32
4.4 預分配值 33
4.5 特殊序列 34
4.5.1 Series錶 34
4.5.2 素數 35
4.5.3 隨機順序值 37
4.5.4 其他序列 39
第5章 基礎錶和相關元素 40
5.1 CREATE TABLE語句 41
5.1.1 列約束 41
5.1.2 DEFAULT子句 43
5.1.3 NOT NULL約束 43
5.1.4 CHECK()約束 44
5.1.5 UNIQUE以及PRIMARY KEY約束 46
5.1.6 REFERENCES子句 47
5.2 嵌套UNIQUE約束 49
5.2.1 重疊鍵 52
5.2.2 單列唯一性與多列唯一性 54
5.3 CREATE ASSERTION約束 62
5.4 臨時錶 62
5.5 錶操作 63
5.5.1 DROP TABLE <錶名> 64
5.5.2 ALTER TABLE 64
5.6 避免屬性分割 65
5.6.1 錶級屬性分割 66
5.6.2 行級屬性分割 67
5.7 在DDL中錶現類層次關係 68
5.8 顯式物理定位器 70
5.9 自增列 70
5.9.1 ROWID與物理磁盤地址 72
5.9.2 標識列 72
5.9.3 對比標識列和序列 73
5.10 生成標識符 73
5.10.1 行業標準的唯一標識符 73
5.10.2 國防部的唯一標識符 74
5.10.3 序列生成函數 75
5.10.4 唯一值生成器 75
5.10.5 驗證源 76
5.11 關於重復行 77
5.12 其他模式對象 78
5.13 臨時錶 79
5.14 CREATE DOMAIN語句 79
5.15 CREATE TRIGGER語句 80
5.16 CREATE PROCEDURE語句 80
5.17 DECLARE CURSOR語句 81
5.17.1 如何使用遊標 83
5.17.2 位置更新及刪除語句 84
第6章 過程式、半過程式以及聲明式編程 86
6.1 軟件工程基本原理 86
6.2 內聚性 86
6.3 耦閤度 87
6.4 大跨越 88
6.4.1 一個常見的錯誤 88
6.4.2 一處改進 89
6.5 重寫技巧 94
6.5.1 數據錶和生成器代碼 95
6.5.2 用計算替代查找 96
6.5.3 斐波那契數列 96
6.6 謂詞函數 97
6.7 過程化分解和邏輯分解 98
6.7.1 過程式分解方案 99
6.7.2 邏輯分解方案 100
第7章 過程式結構 102
7.1 創建過程 102
7.2 創建觸發器 103
7.3 遊標 106
7.3.1 DECLARE CURSOR語句 106
7.3.2 ORDER BY子句 107
7.3.3 OPEN語句 113
7.3.4 FETCH語句 113
7.3.5 CLOSE語句 114
7.3.6 DEALLOCATE語句 114
7.3.7 如何使用遊標 114
7.3.8 位置更新及刪除語句 117
7.4 序列 117
7.5 生成列 118
7.6 錶函數 119
第8章 輔助錶 121
8.1 序列錶 121
8.1.1 對列錶進行枚舉 122
8.1.2 將序列映射為循環 124
8.1.3 取代迭代循環 125
8.2 查找輔助錶 127
8.2.1 簡單轉換輔助錶 128
8.2.2 多轉換值輔助錶 128
8.2.3 多參數輔助錶 129
8.2.4 範圍輔助錶 129
8.2.5 層次結構輔助錶 130
8.2.6 “一個真正的查找錶” 131
8.3 輔助函數錶 133
8.3.1 用輔助錶求反函數 134
8.3.2 用輔助函數錶進行插值 141
8.4 全局常量錶 143
8.4.1 預分配值 143
8.4.2 素數 144
8.4.3 斐波那契數列 144
8.4.4 隨機順序值 145
8.5 把過程代碼轉換成錶時的注意事項 147
第9章 規範化 152
9.1 函數依賴和多值依賴 154
9.2 第一範式(1NF) 154
9.3 第二範式(2NF) 158
9.4 第三範式(3NF) 159
9.5 基本關鍵字範式(EKNF) 160
9.6 Boyce-Codd範式(BCNF) 161
9.7 第四範式(4NF) 162
9.8 第五範式(5NF) 163
9.9 域-鍵範式(DKNF) 164
9.10 規範化的實用技巧 171
9.11 鍵類型 172
9.11.1 自然鍵 172
9.11.2 人工鍵 172
9.11.3 對外暴露的物理定位器 173
9.12 非規範化的實用技巧 174
第10章 SQL的數值數據 180
10.1 數值類型 180
10.2 數值類型的轉換 183
10.2.1 數值的捨入和截斷 183
10.2.2 CAST()函數 185
10.3 四則運算函數 185
10.4 算術運算和NULL 186
10.5 值與NULL的相互轉換 187
10.5.1 NULLIF()函數 187
10.5.2 COALESCE()函數 187
10.6 數學函數 189
10.6.1 數學運算符 189
10.6.2 指數函數 191
10.6.3 標量函數 192
10.6.4 將數值轉換為文字 192
10.7 唯一值生成器 193
10.7.1 存有間隙的序列 194
10.7.2 預分配數值 194
10.8 IP地址 195
10.8.1 CHAR(39)存儲 195
10.8.2 二進製存儲 196
10.8.3 使用多個單獨的SMALLINT 196
第11章 SQL中的時間數據類型 197
11.1 關於日曆標準的說明 197
11.2 SQL時間數據類型 199
11.2.1 時間的內部錶示 200
11.2.2 日期格式標準 200
11.2.3 處理時間戳 201
11.2.4 處理時間 202
11.2.5 時區和夏令時 203
11.3 INTERVAL數據類型 204
11.4 時間算術 206
11.5 時間數據模型的特性 207
11.5.1 為持續時間建模 207
11.5.2 持續時間之間的關係 209
第12章 字符數據類型 211
12.1 SQL字符串問題 211
12.1.1 字符串相等問題 212
12.1.2 字符串排序問題 212
12.1.3 字符串分組問題 213
12.2 標準字符串函數 213
12.3 常見的廠商擴展 214
12.4 Cutter錶 222
12.5 嵌套替換 223
第13章 NULL:SQL中的缺失數據 224
13.1 空錶和缺失錶 225
13.2 列中的缺失值 225
13.3 上下文和缺失值 226
13.4 比較NULL 227
13.5 NULL和邏輯 228
13.5.1 子查詢謂詞中的NULL 229
13.5.2 邏輯值謂詞 231
13.6 算術中的NULL值 231
13.7 函數中的NULL值 231
13.8 NULL和宿主語言 231
13.9 NULL的設計忠告 232
13.10 關於多NULL值的說明 234
第14章 多列數據元素 237
14.1 距離函數 237
14.2 在SQL中存儲IPv4地址 239
14.2.1 使用單個VARCHAR(15)列錶示IPv4地址 239
14.2.2 使用一個INTEGER列錶示IPv4地址 239
14.2.3 使用四個SMALLINT列錶示IPv4地址 240
14.3 在SQL中存儲IPv6地址 241
14.4 貨幣與其他單位的轉換 242
14.5 社會安全號 242
14.6 有理數 245
第15章 錶操作 246
15.1 DELETE FROM語句 246
15.1.1 DELETE FROM子句 246
15.1.2 WHERE子句 247
15.1.3 根據輔助錶中的數據執行刪除 249
15.1.4 在相同錶內進行刪除 250
15.1.5 不用聲明引用完整性在多個錶中進行刪除 252
15.2 INSERT INTO語句 253
15.2.1 INSERT INTO子句 253
15.2.2 插入的性質 254
15.2.3 批量裝載和卸載實用程序 255
15.3 UPDATE語句 255
15.3.1 UPDATE子句 255
15.3.2 WHERE子句 256
15.3.3 SET子句 256
15.3.4 利用第二張錶進行更新 257
15.3.5 在UPDATE中使用CASE錶達式 259
15.4 常見廠商擴展的缺陷說明 261
15.5 MERGE語句 263
第16章 比較或theta操作 266
16.1 數據類型轉換 266
16.1.1 日期顯示格式 267
16.1.2 其他顯示格式 268
16.2 SQL中的行比較 268
16.3 IS [NOT] DISTINCT FROM操作符 270
第17章 值化謂詞 271
17.1 IS NULL謂詞 271
17.2 IS [NOT] {TRUE | FALSE | UNKNOWN}謂詞 272
17.3 IS [NOT] NORMALIZED謂詞 273
第18章 CASE錶達式 275
18.1 CASE錶達式 275
18.1.1 COALESCE()和NULLIF()函數 278
18.1.2 帶GROUP BY的CASE錶達式 278
18.1.3 CASE、CHECK()子句和邏輯蘊涵 280
18.2 子查詢錶達式和常量 283
18.3 Rozenshtein特徵函數 283
第19章 LIKE與SIMILAR TO謂詞 285
19.1 使用模式的技巧 285
19.2 NULL值和空字符串的謂詞結果 287
19.3 LIKE並不是相等 287
19.4 用聯結消除LIKE謂詞 287
19.5 CASE錶達式和LIKE搜索條件 288
19.6 SIMILAR TO謂詞 289
19.7 字符串的有關技巧 291
19.7.1 字符串的字符內容 291
19.7.2 搜索與聲明一個串 291
19.7.3 創建字符串中的索引 292
第20章 BETWEEN和OVERLAPS謂詞 293
20.1 BETWEEN謂詞 293
20.1.1 NULL值的結果 294
20.1.2 空集的結果 294
20.1.3 程序設計技巧 295
20.2 OVERLAPS謂詞 296
第21章 [NOT] IN()謂詞 305
21.1 優化IN()謂詞 306
21.2 用IN()謂詞替換OR 309
21.3 NULL和IN()謂詞 309
21.4 IN()謂詞和引用約束 312
21.5 IN()謂詞和標量查詢 313
第22章 EXISTS()謂詞 315
22.1 EXISTS和NULL 316
22.2 EXISTS和INNER JOIN 318
22.3 NOT EXISTS和OUTER JOIN 318
22.4 EXISTS()和量詞 319
22.5 EXISTS()和引用約束 320
22.6 EXISTS和三值邏輯 320
第23章 量化子查詢謂詞 323
23.1 標量子查詢比較 323
23.2 量詞和缺失數據 324
23.3 ALL謂詞和極值函數 326
23.4 UNIQUE謂詞 327
23.5 DISTINCT謂詞 328
第24章 簡單SELECT語句 329
24.1 SELECT語句執行順序 329
24.2 單級SELECT語句 329
第25章 高級SELECT語句 336
25.1 關聯子查詢 336
25.2 嵌入的INNER JOIN 340
25.3 OUTER JOIN 341
25.3.1 OUTER JOIN的一些曆史 342
25.3.2 NULL和OUTER JOIN 346
25.3.3 NATURAL JOIN與搜索式OUTER JOIN 347
25.3.4 OUTER JOIN自聯結 348
25.3.5 兩次或多次OUTER JOIN 349
25.3.6 OUTER JOIN和聚閤函數 351
25.3.7 FULL OUTER JOIN 351
25.4 UNION JOIN操作符 352
25.5 標量SELECT錶達式 353
25.6 舊JOIN語法與新JOIN語法 354
25.7 受約束的JOIN 355
25.7.1 庫存和訂單 355
25.7.2 穩定的婚姻 356
25.7.3 將球裝入盒中 360
25.8 Codd博士的T聯結 363
25.8.1 Stobbs方案 366
25.8.2 Pieere方案 367
25.8.3 參考文獻 368
第26章 虛擬錶:視圖、派生錶、CTE及MQT 369
26.1 查詢中的視圖 369
26.2 可更新視圖和隻讀視圖 370
26.3 視圖的類型 371
26.3.1 單錶投影和限製 371
26.3.2 計算列 371
26.3.3 轉換列 372
26.3.4 分組視圖 372
26.3.5 聯結視圖 373
26.3.6 視圖的聯結 374
26.3.7 嵌套視圖 375
26.4 數據庫引擎如何處理視圖 376
26.4.1 視圖列列錶 376
26.4.2 視圖物化 376
26.4.3 內嵌文本擴展 377
26.4.4 指針結構 378
26.4.5 索引和視圖 379
26.5 WITH CHECK OPTION子句 379
26.6 刪除視圖 383
26.7 視圖與臨時錶的使用提示 384
26.7.1 使用視圖 384
26.7.2 使用臨時錶 385
26.7.3 用視圖扁平化錶 385
26.8 使用派生錶 387
26.8.1 FROM子句中的派生錶 387
26.8.2 包含VALUES構造器的派生錶 388
26.9 公用錶錶達式 389
26.10 遞歸公用錶錶達式 390
26.10.1 簡單增量 391
26.10.2 簡單樹遍曆 391
26.11 物化查詢錶 392
第27章 在查詢中分區數據 393
27.1 覆蓋和分區 393
27.1.1 按範圍分區 393
27.1.2 單列範圍錶 394
27.1.3 用函數進行分區 394
27.1.4 按順序分區 395
27.1.5 使用窗口函數進行分區 397
27.2 關係除法 398
27.2.1 帶餘除法 399
27.2.2 精確除法 400
27.2.3 性能說明 400
27.2.4 Todd的除法 401
27.2.5 帶JOIN的除法 403
27.2.6 用集閤操作符進行除法 403
27.3 Romley除法 404
27.4 RDBMS中的布爾錶達式 407
27.5 FIFO和LIFO子集 408
第28章 分組操作 411
28.1 GROUP BY子句 411
28.2 GROUP BY和HAVING 412
28.3 多層次聚閤 415
28.3.1 多級聚閤的分組視圖 415
28.3.2 多層次聚閤的子查詢錶達式 416
28.3.3 多層聚閤的CASE錶達式 417
28.4 在計算列上分組 418
28.5 成對分組 418
28.6 排序和GROUP BY 420
第29章 簡單聚閤函數 422
29.1 COUNT()函數 422
29.2 SUM()函數 426
29.3 AVG()函數 427
29.3.1 空組的平均數 428
29.3.2 多個列上的平均值 429
29.4 極值函數 430
29.4.1 簡單的極值函數 430
29.4.2 廣義極值函數 432
29.4.3 多條件極值函數 438
29.4.4 GREATEST()和LEAST()函數 439
29.5 LIST()聚閤函數 442
29.5.1 使用遞歸CTE的LIST聚閤函數 442
29.5.2 交叉錶的LIST()函數 443
29.6 PRD()聚閤函數 443
29.6.1 通過錶達式實現PRD()函數 444
29.6.2 通過對數實現PRD()聚閤函數 445
29.7 位運算符聚閤函數 447
29.7.1 OR位運算符聚閤函數 448
29.7.2 AND位運算符聚閤函數 449
第30章 高級分組、窗口聚閤以及SQL中的OLAP 450
30.1 星模式 450
30.2 GROUPING操作符 451
30.2.1 GROUP BY GROUPING SET 451
30.2.2 ROLLUP 452
30.2.3 CUBE 452
30.2.4 SQL的OLAP示例 453
30.3 窗口子句 454
30.3.1 PARTITION BY子句 454
30.3.2 ORDER BY子句 454
30.3.3 窗口幀子句 455
30.4 窗口化聚閤函數 456
30.5 序號函數 457
30.5.1 行號 457
30.5.2 RANK()和DENSE_RANK() 457
30.5.3 PERCENT_RANK()和CUME_DIST() 457
30.5.4 一些示例 458
30.6 廠商擴展 460
30.6.1 LEAD和LAG函數 460
30.6.2 FIRST和LAST函數 461
30.7 一點曆史知識 462
第31章 SQL中的描述性統計 463
31.1 眾數 463
31.2 AVG()函數 464
31.3 中值 464
31.3.1 中值編程問題 465
31.3.2 Celko第一中值 466
31.3.3 Date第二中值 467
31.3.4 Murchison中值 468
31.3.5 Celko第二中值 468
31.3.6 Vaughan提齣的應用視圖的中值 470
31.3.7 使用特徵函數的中值 470
31.3.8 Celko第三中值 473
31.3.9 Ken Henderson的中值 475
31.3.10 OLAP中值 476
31.4 方差和標準偏差 478
31.5 平均偏差 479
31.6 纍積統計 479
31.6.1 運行差分 479
31.6.2 纍積百分比 481
31.6.3 序號函數 483
31.6.4 五分位數和相關統計 486
31.7 交叉錶 486
31.7.1 通過交叉聯結建立交叉錶 489
31.7.2 通過外聯結建立交叉錶 490
31.7.3 通過子查詢建立交叉錶 490
31.7.4 使用CASE錶達式建立交叉錶 491
31.8 調和平均數和幾何平均數 491
31.9 SQL中的多變量描述統計數據 492
31.9.1 協方差 492
31.9.2 皮爾森相關係數r 493
31.9.3 多變量描述統計中的NULL值 493
31.10 SQL:2006中的統計函數 494
31.10.1 方差、標準偏差以及描述統計 494
31.10.2 相關性 494
31.10.3 分布函數 495
第32章 子序列、區域、順串、間隙及島嶼 496
32.1 查找尺寸為n的子區域 496
32.2 為區域編號 497
32.3 查找最大尺寸的區域 499
32.4 界限查詢 502
32.5 順串和序列查詢 503
32.6 數列的求和 506
32.7 交換和平移列錶值 509
32.8 壓縮一列數值 510
32.9 摺疊一列數值 510
32.10 覆蓋 511
第33章 SQL中的矩陣 516
33.1 通過命名列進行訪問的數組 516
33.2 通過下標列進行訪問的數組 519
33.3 SQL的矩陣操作 520
33.3.1 矩陣等式 521
33.3.2 矩陣加法 521
33.3.3 矩陣乘法 522
33.3.4 矩陣轉置 523
33.3.5 行排序及列排序 524
33.3.6 其他矩陣操作 524
33.4 將錶扁平化為數組 524
33.5 比較錶格式中的數組 526
第34章 集閤操作 528
34.1 UNION和UNION ALL 528
34.1.1 執行順序 530
34.1.2 混閤使用UNION和UNION ALL操作符 531
34.1.3 對同一錶中的列執行UNION操作 531
34.2 INTERSECT和EXCEPT 531
34.2.1 沒有NULL值和重復行時的INTERSECT和EXCEPT操作 534
34.2.2 存在NULL值和重復行時的INTERSECT和EXCEPT操作 535
34.3 關於ALL和SELECT DISTINCT的一個說明 536
34.4 相等子集和真子集 536
第35章 子集 538
35.1 錶中的每個第n項 538
35.2 從錶中選取隨機行 539
35.3 CONTAINS操作符 543
35.3.1 真子集操作符 543
35.3.2 錶的相等操作 544
35.4 序列間隙 547
35.5 重疊區間的覆蓋問題 549
35.6 選取有代錶性的子集 552
第36章 SQL中的樹和層次結構 556
36.1 鄰接列錶模型 557
36.1.1 復雜約束 557
36.1.2 查詢的過程遍曆 559
36.1.3 更改錶 560
36.2 路徑枚舉模型 560
36.2.1 查找子樹和節點 561
36.2.2 找齣層次和後代 561
36.2.3 刪除節點和子樹 562
36.2.4 完整性約束 562
36.3 層次結構的嵌套集閤模型 563
36.3.1 計數特性 564
36.3.2 包含特性 564
36.3.3 下級節點 565
36.3.4 層次聚閤 566
36.3.5 刪除節點和子樹 566
36.3.6 將鄰接列錶轉換為嵌套集閤模型 567
36.4 其他錶現樹和層次結構的模型 569
第37章 SQL中的圖 570
37.1 鄰接列錶模型圖 570
37.1.1 SQL和鄰接列錶模型 571
37.1.2 路徑與CTE 572
37.1.3 環狀圖 577
37.1.4 鄰接矩陣模型 579
37.2 分割嵌套集閤模型錶示的圖節點 580
37.2.1 圖中的所有節點 581
37.2.2 路徑端點 581
37.2.3 可達節點 582
37.2.4 邊 582
37.2.5 入度和齣度 582
37.2.6 源節點、匯聚節點、孤立節點和內部節點 583
37.2.7 將無環圖轉化為嵌套集閤 584
37.3 多邊形中的點 586
37.4 圖論參考書目 588
第38章 時間查詢 589
38.1 時間數學 589
38.2 個性化日曆 591
38.3 時間序列 592
38.3.1 時間序列中的間隙 593
38.3.2 連續時間段 595
38.3.3 相鄰事件中缺失的時間 600
38.3.4 查找日期 603
38.3.5 時間的起始點和結束點 604
38.3.6 開始時間和結束時間 605
38.4 儒略日 606
38.5 其他時間函數 609
38.6 星期 610
38.7 在錶中對時間建模 612
38.8 日曆輔助錶 614
38.9 2000年問題 616
38.9.1 零 616
38.9.2 閏年 617
38.9.3 韆年問題 618
38.9.4 舊數據中的怪異日期 619
38.9.5 後果 619
第39章 優化SQL 620
39.1 訪問方法 621
39.1.1 順序訪問 621
39.1.2 索引訪問 621
39.1.3 散列索引 622
39.1.4 位嚮量索引 622
39.2 如何建立索引 622
39.2.1 使用簡單查詢條件 623
39.2.2 簡單字符串錶達式 624
39.2.3 簡單時間錶達式 625
39.3 提供額外信息 626
39.4 謹慎建立多列索引 627
39.5 考察IN謂詞 627
39.6 避免UNION 629
39.7 聯結勝於嵌套查詢 629
39.8 使用更少的語句 630
39.9 避免排序 631
39.10 避免交叉聯結 634
39.11 瞭解優化器 635
39.12 在模式更改後重編譯靜態SQL 636
39.13 臨時錶有時能帶來方便 637
39.14 更新統計數據 639
39.15 不要迷信較新的特性 639
參考文獻 642
· · · · · · (
收起)