內容介紹
《SQL權威指南(第4版)》為SQL名著中文版,兼顧技術與實踐,全面細緻介紹高級技術,致力於打造SQL編程專家。《SQL權威指南(第4版)》闡釋了資料庫設計、最佳化和操作的各方面內容,提供了成為SQL編程專業人士所需的技術與技巧、針對新舊挑戰性難題的優秀解決方案、專業的思考方式(以保證程式的正確性與高效性),並涉及了資料庫設計與規範化、SQL數據類型、查詢、分組、集合操作、最佳化等主題。另外,JoeCelko(塞科)以通俗易懂的語言敘述了一些關鍵問題,比如避免使用過多NULL的原因及查詢最佳化方式等。《SQL權威指南(第4版)》適合中高級SQL編程人員學習參考。作者介紹
Joe Celko 世界著名的資料庫專家,曾擔任ANSl SQL標準委員會成員達10年之久,參與了SQL-89和SQL-92標準的制定,是世界上讀者數量最多的SQL圖書作者之一。他曾撰寫過一系列專欄,並通過他的新聞組支持和推動了資料庫編程技術以及ANSl/ISO標準的發展。除本書外,他還撰寫了多部SQL經典著作,包括《SQL編程風格》、《SQL解惑》和《SQL權威指南》,上述作品的中文版均已由人民郵電出版社出版。作品目錄
第1章 資料庫與檔案系統11.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 事務與ACID9
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 GUID30
4.2.2 UUID31
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 TABLE64
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 算術運算和NULL186
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 使用多個單獨的SMALLINT196
第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 比較NULL227
13.5 NULL和邏輯228
13.5.1 子查詢謂詞中的NULL229
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 ISNULL謂詞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()謂詞替換OR309
21.3 NULL和IN()謂詞309
21.4 IN()謂詞和引用約束312
21.5 IN()謂詞和標量查詢313
第22章EXISTS()謂詞315
22.1 EXISTS和NULL316
22.2 EXISTS和INNERJOIN318
22.3 NOT EXISTS和OUTER JOIN318
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 JOIN340
25.3 OUTER JOIN341
25.3.1 OUTER JOIN的一些歷史342
25.3.2 NULL和OUTER JOIN346
25.3.3 NATURAL JOIN與搜尋式OUTER JOIN347
25.3.4 OUTER JOIN自聯結348
25.3.5 兩次或多次OUTERJOIN349
25.3.6 OUTER JOIN和聚合函式351
25.3.7 FULL OUTER JOIN351
25.4 UNION JOIN操作符352
25.5 標量SELECT表達式353
25.6 舊JOIN語法與新JOIN語法354
25.7 受約束的JOIN355
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及MQT369
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和HAVING412
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 BY420
第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中的OLAP450
30.1 星模式450
30.2 GROUPING操作符451
30.2.1 GROUP BY GROUPINGSET451
30.2.2 ROLLUP452
30.2.3 CUBE452
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 皮爾森相關係數r493
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 ALL528
34.1.1 執行順序530
34.1.2 混合使用UNION和UNION ALL操作符531
34.1.3 對同一表中的列執行UNION操作531
34.2 INTERSECT和EXCEPT531
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 路徑與CTE572
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章最佳化SQL620
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 避免UNION629
39.7 聯結勝於嵌套查詢629
39.8 使用更少的語句630
39.9 避免排序631
39.10 避免交叉聯結634
39.11 了解最佳化器635
39.12 在模式更改後重編譯靜態SQL636
39.13 臨時表有時能帶來方便637
39.14 更新統計數據639
39.15 不要迷信較新的特性639
參考文獻642