內容簡介
本書全面深入地論述了如何使用結構化查詢語言(SQL)語句來訪問Oracle資料庫,以及使用PL/SQL(ProceduralLanguage/SQL)來編寫包含SQL語句的程式。本書由Oracle前產品經理JasonPrice親筆撰寫,基於新推出的SQL2003規範,詳細介紹了OracleDatabase10g的新特性和功能。全書內容系統、權威,能幫助讀者快速掌握SQL的核心知識。
目錄
第1章簡介 1
1.1關係資料庫簡介 1
1.2結構化查詢語言(SQL)簡介 2
1.3使用SQL*Plus 3
1.3.1啟動Windows版本的SQL*Plus 4
1.3.2啟動命令行版本的SQL*Plus 4
1.4使用SQL*Plus執行SELECT語句 5
1.5SQL*PlusWorksheet 6
1.6創建store模式 7
1.6.1運行SQL*Plus腳本創建store模式 7
1.6.2用來創建store模式的DDL語句 8
1.7添加、修改、刪除行 15
1.7.1向表中添加行 15
1.7.2修改表中的現有行 16
1.7.3從表中刪除行 17
1.8Oracle10g的新數據類型BINARY_FLOAT和BINARY_DOUBLE 17
1.8.1BINARY_FLOAT和BINARY_DOUBLE的優點 17
1.8.2在表中使用BINARY_FLOAT和BINARY_DOUBLE 18
1.8.3特殊值 18
1.9退出SQL*Plus 19
1.10OraclePL/SQL簡介 19
1.11小結 20
第2章從資料庫表中檢索信息 23
2.1對單表執行SELECT語句 23
2.2選擇一個表中的所有列 24
2.3理解行標識符 25
2.4執行算術運算 25
2.4.1日期運算 26
2.4.2列運算 27
2.5使用列別名 28
2.6使用串連操作合併列的輸出結果 29
2.7理解空值 29
2.8禁止顯式重複行 31
2.9使用WHERE子句過濾行 32
2.9.1使用比較操作符 32
2.9.2使用SQL操作符 34
2.9.3使用邏輯操作符 36
2.9.4理解操作符的優先權 37
2.10使用ORDERBY子句對行進行排序 37
2.11執行使用兩個表的SELECT語句 39
2.12使用表別名 41
2.13笛卡爾積 41
2.14執行使用多於兩個表的SELECT語句 42
2.15理解連線條件和連線類型 43
2.15.1理解不等連線 43
2.15.2理解外連線 44
2.15.3理解自連線 47
2.16使用SQL/92語法執行連線 48
2.16.1使用SQL/92標準語法執行兩個表的內連線 48
2.16.2使用USING關鍵字簡化連線 49
2.16.3使用SQL/92執行多於兩個以上表的內連線 50
2.16.4使用SQL/92執行多列的內連線 50
2.16.5使用SQL/92執行外連線 50
2.16.6使用SQL/92執行自連線 52
2.16.7使用SQL/92執行交叉連線 52
2.17小結 53
第3章使用簡單函式 55
3.1使用單行函式 56
3.1.1字元函式 56
3.1.2數字函式 64
3.1.3轉換函式 69
3.1.4正則表達式函式 74
3.2使用聚合函式 78
3.2.1AVG()函式 79
3.2.2COUNT()函式 80
3.2.3MAX()和MIN()函式 80
3.2.4STDDEV()函式 81
3.2.5SUM()函式 81
3.2.6VARIANCE()函式 82
3.3對行進行分組 82
3.3.1使用GROUPBY子句對行進行分組 82
3.3.2調用聚合函式的錯誤用法 85
3.3.3使用HAVING子句過濾行分組 86
3.3.4組合使用WHERE和GROUPBY子句 86
3.3.5組合使用WHERE、GROUPBY和HAVING子句 87
3.4小結 88
第4章日期和時間的存儲與處理 89
4.1幾個簡單的存儲和檢索日期的例子 89
4.2使用TO_CHAR()和TO_DATE()轉換時間值 91
4.2.1使用TO_CHAR()將時間值轉換為字元串 91
4.2.2使用TO_DATE()將字元串轉換為時間值 95
4.3設定默認的日期格式 98
4.4Oracle對2位年份的處理 99
4.4.1使用YY格式 99
4.4.2使用RR格式 99
4.5使用時間值函式 101
4.5.1ADD_MONTHS()函式 101
4.5.2LAST_DAY()函式 102
4.5.3MONTHS_BETWEEN() 102
4.5.4NEXT_DAY()函式 103
4.5.5ROUND()函式 103
4.5.6SYSDATE()函式 104
4.5.7TRUNC()函式 104
4.6理解時區 105
4.6.1與時區有關的函式 106
4.6.2資料庫時區和會話時區 106
4.6.3獲取時區的時差 107
4.6.4獲取時區名 107
4.6.5將時間值從一個時區轉換為另一個時區 108
4.7使用時間戳 108
4.7.1使用TIMESTAMP類型 108
4.7.2與時間戳有關的函式 112
4.8使用時間間隔 116
4.8.1使用INTERVALYEARTOMONTH類型 117
4.8.2使用INTERVALDAYTOSECOND類型 119
4.8.3與時間間隔有關的函式 121
4.9小結 122
第5章使用SQL*Plus 123
5.1查看錶結構 123
5.2編輯SQL語句 124
5.3保存、檢索並運行檔案 126
5.4格式化列 128
5.5設定頁面大小 130
5.6設定行大小 131
5.7清除列格式 131
5.8使用變數 132
5.8.1臨時變數 132
5.8.2已定義變數 135
5.9創建簡單報表 137
5.9.1在腳本中使用臨時變數 137
5.9.2在腳本中使用已定義變數 137
5.9.3向腳本中的變數傳遞值 138
5.9.4添加頁眉和頁腳 139
5.9.5計算小計 140
5.10自動生成SQL語句 141
5.11小結 142
第6章子查詢 143
6.1子查詢的類型 143
6.2編寫單行子查詢 144
6.2.1在WHERE子句中使用子查詢 144
6.2.2在HAVING子句中使用子查詢 145
6.2.3在FROM子句中使用子查詢(內聯視圖) 146
6.2.4可能碰到的兩個錯誤 147
6.3編寫多行子查詢 148
6.3.1在多行子查詢中使用IN操作符 148
6.3.2在多行子查詢中使用ANY操作符 149
6.3.3在多行子查詢中使用ALL操作符 149
6.4編寫多列子查詢 150
6.5編寫關聯子查詢 150
6.5.1關聯子查詢的例子 150
6.5.2在關聯子查詢中使用EXISTS和NOTEXISTS 151
6.6編寫嵌套子查詢 153
6.7編寫包含子查詢的UPDATE和DELETE語句 155
6.7.1編寫包含子查詢的UPDATE語句 155
6.7.2編寫包含子查詢的DELETE語句 155
6.8小結 156
第7章高級查詢 157
7.1使用集合操作符 158
7.1.1示例表 158
7.1.2使用UNIONALL操作符 159
7.1.3使用UNION操作符 160
7.1.4使用INTERSECT操作符 161
7.1.5使用MINUS操作符 161
7.1.6組合使用集合操作符 162
7.2使用TRANSLATE()函式 163
7.3使用DECODE()函式 164
7.4使用CASE表達式 166
7.4.1使用簡單CASE表達式 166
7.4.2使用搜尋CASE表達式 167
7.5層次化查詢 168
7.5.1示例數據 168
7.5.2使用CONNECTBY和STARTWITH子句 170
7.5.3使用偽列LEVEL 171
7.5.4格式化層次化查詢的結果 171
7.5.5從非根節點開始遍歷 172
7.5.6在STARTWITH子句中使用子查詢 173
7.5.7從下向上遍歷樹 173
7.5.8從層次查詢中刪除節點和分支 174
7.5.9在層次化查詢中加入其他條件 175
7.6使用擴展的GROUPBY子句 175
7.7使用ROLLUP子句 177
7.7.1使用CUBE子句 179
7.7.2使用GROUPING()函式 181
7.7.3使用GROUPINGSETS子句 183
7.7.4使用GROUPING_ID()函式 184
7.7.5在GROUPBY子句中多次使用一個列 186
7.7.6使用GROUP_ID()函式 186
7.8使用分析函式 187
7.8.1示例表 188
7.8.2使用評級函式 189
7.8.3使用反百分點函式 195
7.8.4使用視窗函式 196
7.8.5使用報表函式 201
7.8.6使用LAG()和LEAD()函式 203
7.8.7使用FIRST和LAST函式 204
7.8.8使用線性回歸函式 204
7.8.9使用假想評級與分布函式 205
7.9使用MODEL子句 206
7.9.1示例MODEL子句 206
7.9.2用位置標記和符號標記訪問數據單元 208
7.9.3用BETWEEN和AND返回特定範圍內的數據單元 208
7.9.4用ANY和ISANY訪問所有的數據單元 209
7.9.5用CURRENTV()獲取某個維度的當前值 209
7.9.6用FOR循環訪問數據單元 210
7.9.7處理空值和缺失值 212
7.9.8更新已有的單元 214
7.10小結 215
第8章修改表的內容 217
8.1使用INSERT語句添加行 217
8.1.1忽略列的列表 218
8.1.2為列指定空值 219
8.1.3在列值中使用單引號和雙引號 219
8.1.4從一個表向另外一個表複製行 219
8.2使用UPDATE語句修改行 220
8.3使用DELETE語句刪除行 221
8.4資料庫的完整性 222
8.4.1主鍵約束 222
8.4.2外鍵約束 222
8.5使用默認值 223
8.6使用MERGE合併行 225
8.7資料庫事務 227
8.7.1事務的提交和回滾 227
8.7.2事務的開始與結束 228
8.7.3保存點 229
8.7.4事務的ACID特性 230
8.7.5並發事務 230
8.7.6事務鎖 232
8.7.7事務隔離級別 232
8.7.8SERIALIZABLE事務隔離性級別的一個例子 233
8.8查詢閃回 234
8.8.1使用閃回的授權 234
8.8.2時間查詢閃回 234
8.8.3系統變更號查詢閃回 236
8.9小結 237
第9章資料庫安全性 239
9.1用戶 239
9.1.1創建用戶 240
9.1.2修改用戶密碼 241
9.1.3刪除用戶 241
9.2系統特權 241
9.2.1向用戶授予系統特權 242
9.2.2檢查授予用戶的系統特權 243
9.2.3使用系統特權 244
9.2.4撤銷用戶的系統特權 244
9.3對象特權 244
9.3.1向用戶授予對象特權 245
9.3.2檢查已授予的對象特權 245
9.3.3檢查已接受的對象特權 247
9.3.4使用對象特權 249
9.3.5同名對象 249
9.3.6公共同名對象 250
9.3.7撤銷用戶的對象特權 251
9.4角色 251
9.4.1創建角色 251
9.4.2為角色授權 252
9.4.3將角色授予用戶 252
9.4.4檢查授予用戶的角色 253
9.4.5檢查授予角色的系統特權 254
9.4.6檢查授予角色的對象特權 254
9.4.7使用授予角色的特權 256
9.4.8默認角色 256
9.4.9撤銷角色 257
9.4.10從角色中撤銷特權 257
9.4.11刪除角色 257
9.5小結 257
第10章創建表、序列、索引和視圖 259
10.1表 259
10.1.1創建表 260
10.1.2獲得有關表的信息 261
10.1.3獲得表中列的信息 262
10.1.4修改表 263
10.1.5重命名表 271
10.1.6向表添加注釋 271
10.1.7截斷表 272
10.1.8刪除表 272
10.2序列 272
10.2.1創建序列 272
10.2.2獲取有關序列的信息 274
10.2.3使用序列 275
10.2.4使用序列填充主鍵 276
10.2.5修改序列 277
10.2.6刪除序列 278
10.3索引 278
10.3.1創建索引 278
10.3.2創建基於函式的索引 279
10.3.3獲取有關索引的信息 280
10.3.4獲取列索引的信息 281
10.3.5修改索引 281
10.3.6刪除索引 281
10.4視圖 282
10.4.1創建並使用視圖 282
10.4.2修改視圖 289
10.4.3刪除視圖 289
10.5小結 290
第11章PL/SQL編程簡介 291
11.1塊結構 292
11.2變數和類型 293
11.3條件邏輯 294
11.4循環 294
11.4.1簡單循環 295
11.4.2WHILE循環 295
11.4.3FOR循環 295
11.5游標 296
11.5.1步驟1:聲明用於保存列值的變數 296
11.5.2步驟2:聲明游標 297
11.5.3步驟3:打開游標 297
11.5.4步驟4:從游標中取得記錄 297
11.5.5步驟5:關閉游標 298
11.5.6完整的實例:product_cursor.sql 298
11.5.7游標與FOR循環 300
11.6異常 301
11.6.1ZERO_DIVIDE異常 302
11.6.2DUP_VAL_ON_INDEX異常 303
11.6.3INVALID_NUMBER異常 303
11.6.4OTHERS異常 303
11.7過程 304
11.7.1創建過程 304
11.7.2調用過程 307
11.7.3獲取有關過程的信息 307
11.7.4刪除過程 308
11.7.5查看過程中的錯誤 308
11.8函式 309
11.8.1創建函式 309
11.8.2調用函式 310
11.8.3獲取有關函式的信息 310
11.8.4刪除函式 311
11.9包 311
11.9.1創建包規範 311
11.9.2創建包體 312
11.9.3調用包中的函式和過程 313
11.9.4獲取有關包中函式和過程的信息 314
11.9.5刪除包 314
11.10觸發器 314
11.10.1觸發器運行的時機 314
11.10.2設定示例觸發器 315
11.10.3創建觸發器 315
11.10.4激活觸發器 316
11.10.5獲取有關觸發器的信息 317
11.10.6禁用和啟用觸發器 319
11.10.7刪除觸發器 319
11.11小結 319
第12章資料庫對象 321
12.1對象簡介 321
12.2創建對象類型 322
12.3使用DESCRIBE獲取有關對象類型的信息 324
12.4用對象類型定義列對象和對象表 325
12.5對products表執行DML操作 325
12.5.1將記錄插入到products表中 326
12.5.2從products表中查詢記錄 326
12.5.3修改products表中的記錄 327
12.5.4從products表中刪除記錄 327
12.6對object_products表執行DML 327
12.6.1向object_products表中插入記錄 328
12.6.2從object_products表中選擇記錄 328
12.6.3更新object_products表中的記錄 328
12.6.4從object_products表中刪除記錄 329
12.7對object_customers表執行DML 329
12.7.1向object_customers表中插入記錄 329
12.7.2從object_customers表中查詢記錄 329
12.8對purchases表執行DML 330
12.8.1向purchases表中插入記錄 331
12.8.2從purchases表中選擇記錄 331
12.8.3更新purchases表中的記錄 332
12.9在PL/SQL中使用對象 332
12.10類型繼承 334
12.11NOTINSTANTIABLE對象類型 335
12.12用戶自定義的構造函式 336
12.13小結 339
第13章集合 341
13.1集合簡介 341
13.2變長數組 342
13.2.1創建變長數組類型 342
13.2.2使用變長數組類型定義表列 343
13.2.3獲得變長數組信息 343
13.2.4填充變長數組元素 344
13.2.5查找變長數組元素 345
13.2.6更改變長數組元素 345
13.3嵌套表 345
13.3.1創建嵌套表類型 346
13.3.2使用嵌套表類型定義表列 346
13.3.3獲得嵌套表信息 346
13.3.4填充嵌套表元素 348
13.3.5查找嵌套表元素 348
13.3.6更改嵌套表元素 348
13.4多級集合類型 349
13.5在PL/SQL中使用集合 351
13.5.1操作變長數組 351
13.5.2操作嵌套表 353
13.5.3集合方法 355
13.6Oracle10g對集合的改進 362
13.6.1關聯數組 362
13.6.2更改元素類型的大小或精度 363
13.6.3增加變長數組的元素數目 363
13.6.4在臨時表中使用變長數組 363
13.6.5為嵌套表的存儲表使用不同的表空間 364
13.6.6對嵌套表的ANSI支持 364
13.7小結 372
第14章大對象 373
14.1大對象(LOB)簡介 373
14.2示例檔案 374
14.3理解大對象類型 374
14.4創建包含大對象的表 375
14.5在SQL中使用大對象 376
14.5.1使用CLOB和BLOB 376
14.5.2使用BFILE 377
14.6在PL/SQL中使用大對象 379
14.6.1READ() 380
14.6.2WRITE() 383
14.6.3APPEND() 384
14.6.4CLOSE() 386
14.6.5COMPARE() 386
14.6.6COPY() 388
14.6.7CREATETEMPORARY() 390
14.6.8ERASE() 391
14.6.9FILECLOSE() 392
14.6.10FILECLOSEALL() 393
14.6.11FILEEXISTS() 393
14.6.12FILEGETNAME() 394
14.6.13FILEISOPEN() 394
14.6.14FILEOPEN() 395
14.6.15FREETEMPORARY() 396
14.6.16GETCHUNKSIZE() 396
14.6.17GET_STORAGE_LIMIT() 397
14.6.18GETLENGTH() 397
14.6.19INSTR() 397
14.6.20ISOPEN() 400
14.6.21ISTEMPORARY() 400
14.6.22LOADFROMFILE() 401
14.6.23LOADBLOBFROMFILE() 404
14.6.24LOADCLOBFROMFILE() 405
14.6.25OPEN() 405
14.6.26SUBSTR() 406
14.6.27TRIM() 407
14.6.28WRITEAPPEND() 408
14.7理解LONG和LONGRAW類型 408
14.7.1示例表 409
14.7.2使用LONG和LONGRAW列 409
14.8Oracle10g對大對象的增強 410
14.8.1CLOB和NCLOB對象之間的隱式轉換 410
14.8.2在觸發器中使用LOB時:new屬性的用法 411
14.9小結 412
第15章使用Java運行SQL 413
15.1準備工作 414
15.2配置計算機 414
15.2.1設定ORACLE_HOME環境變數 414
15.2.2設定JAVA_HOME環境變數 415
15.2.3設定PATH環境變數 415
15.2.4設定CLASSPATH環境變數 416
15.2.5設定LD_LIBRARAY_PATH環境變數 416
15.3OracleJDBC驅動程式 416
15.3.1Thin驅動程式 417
15.3.2OCI驅動器 417
15.3.3伺服器端內部驅動器 417
15.3.4伺服器端Thin驅動器 417
15.4導入JDBC包 417
15.5註冊OracleJDBC驅動程式 418
15.6打開資料庫連線 418
15.6.1使用DriverManager類的getConnection()方法連線資料庫 418
15.6.2使用Oracle數據源連線資料庫 420
15.7創建JDBCStatement對象 422
15.8從資料庫檢索列 423
15.8.1步驟1:創建和填充ResultSet對象 423
15.8.2步驟2:從ResultSet對象中讀取列值 424
15.8.3步驟3:關閉ResultSet對象 426
15.9向資料庫添加行 426
15.10更改資料庫的行 427
15.11刪除資料庫的行 427
15.12處理數字 428
15.13處理資料庫Null值 429
15.14控制資料庫事務 430
15.15執行DDL語句 431
15.16處理異常 432
15.17關閉JDBC對象 433
15.18示例程式:BasicExample1.java 434
15.18.1編譯BasicExample1 439
15.18.2運行BasicExample1 439
15.19預備SQL語句 441
15.20OracleJDBC擴展 446
15.20.1oracle.sql包 446
15.20.2oracle.jdbc包 450
15.20.3示例程式:BasicExample3.java 453
15.21小結 456
第16章SQL最佳化 457
16.1SQL最佳化簡介 457
16.2使用WHERE子句過濾行 458
16.3使用表連線而不是多個查詢 458
16.4執行連線時使用完全限定的列引用 459
16.5使用CASE表達式而不是多個查詢 460
16.6添加表索引 461
16.7使用WHERE而不是HAVING 461
16.8使用UNIONALL而不是UNION 462
16.9使用EXISTS而不是IN 464
16.10使用EXISTS而不是DISTINCT 464
16.11使用綁定變數 465
16.11.1不相同的SQL語句 465
16.11.2使用綁定變數定義相同SQL語句 466
16.11.3列出和輸出綁定變數 467
16.11.4使用綁定變數存儲PL/SQL函式的返回值 467
16.11.5使用綁定變數存儲REFCURSOR的行 467
16.12比較執行查詢的成本 468
16.12.1檢查執行計畫 468
16.12.2比較執行計畫 473
16.13為最佳化器傳遞提示 474
16.14其他最佳化工具 474
16.14.1Statspack包 474
16.14.2OracleEnterpriseManagerDiagnosticsPack 475
16.14.3自動資料庫診斷監控 475
16.15小結 475
附錄AOracle數據類型 477
A.1OracleSQL類型 477
A.2OraclePL/SQL類型 479