內容簡介
《程式設計師的SQL金典》主要介紹SQL的語法規則及在實際開發中的套用,並且對SQL在MySQL、MS SQL Server、Oracle和DB2中的差異進行了分析。《程式設計師的SQL金典》分為3部分:第1部分為基礎篇,主要講解資料庫對增、刪、改、查等SQL的支持,給出了這些SQL的套用案例;第2部分為進階篇,講解了函式、子查詢、表連線、不同DBMS中的SQL語法差異、SQL調優、NULL值處理、事務、開窗函式等高級技術;第3部分為案例篇,對前兩部分的知識進行了綜合運用。
《程式設計師的SQL金典》適合程式開發人員及資料庫工程師參考學習,也可作為高等院校相關專業師生的參考書。
圖書目錄
第1章 資料庫入門 1
1.1 資料庫概述 1
1.1.1 資料庫與資料庫管理系統 1
1.1.2 資料庫能做什麼 2
1.1.3 主流資料庫管理系統介紹 2
1.2 資料庫基礎概念 5
1.2.1 Catalog 5
1.2.2 表(Table) 6
1.2.3 列(Column) 7
1.2.4 數據類型(DataType) 8
1.2.5 記錄(Record) 9
1.2.6 主鍵(PrimaryKey) 9
1.2.7 索引(Index) 10
1.2.8 表關聯 12
1.2.9 資料庫的語言——SQL 13
1.2.10 DBA與程式設計師 14
第2章 數據表的創建和管理 17
2.1 數據類型 17
2.1.1 整數類型 17
2.1.2 數值類型 19
2.1.3 字元相關類型 21
2.1.4 日期時間類型 23
2.1.5 二進制類型 24
2.2 通過SQL語句管理數據表 25
2.2.1 創建數據表 25
2.2.2 定義非空約束 26
2.2.3 定義默認值 27
2.2.4 定義主鍵 27
2.2.5 定義外鍵 29
2.2.6 修改已有數據表 30
2.2.7 刪除數據表 31
2.2.8 受限操作的變通解決方案 31
第3章 數據的增、刪、改 33
3.1 數據的插入 34
3.1.1 簡單的INSERT語句 34
3.1.2 簡化的INSERT語句 36
3.1.3 非空約束對數據插入的影響 36
3.1.4 主鍵對數據插入的影響 37
3.1.5 外鍵對數據插入的影響 38
3.2 數據的更新 38
3.2.1 簡單的數據更新 39
3.2.2 帶WHERE子句的UPDATE語句 40
3.2.3 非空約束對數據更新的影響 41
3.2.4 主鍵對數據更新的影響 42
3.2.5 外鍵對數據更新的影響 42
3.3 數據的刪除 43
3.3.1 簡單的數據刪除 43
3.3.2 帶WHERE子句的DELETE語句 44
第4章 數據的檢索 47
4.1 SELECT基本用法 48
4.1.1 簡單的數據檢索 48
4.1.2 檢索出需要的列 49
4.1.3 列別名 51
4.1.4 按條件過濾 52
4.1.5 數據匯總 53
4.1.6 排序 56
4.2 高級數據過濾 59
4.2.1 通配符過濾 59
4.2.2 空值檢測 63
4.2.3 反義運算符 64
4.2.4 多值檢測 65
4.2.5 範圍值檢測 66
4.2.6 低效的“WHERE 1=1” 68
4.3 數據分組 72
4.3.1 數據分組入門 74
4.3.2 數據分組與聚合函式 76
4.3.3 HAVING語句 79
4.4 限制結果集行數 81
4.4.1 MySQL 81
4.4.2 MS SQL Server 2000 82
4.4.3 MS SQL Server 2005 83
4.4.4 Oracle 84
4.4.5 DB2 86
4.4.6 資料庫分頁 88
4.5 抑制數據重複 90
4.6 計算欄位 91
4.6.1 常量欄位 92
4.6.2 欄位間的計算 93
4.6.3 數據處理函式 95
4.6.4 字元串的拼接 97
4.6.5 計算欄位的其他用途 103
4.7 不從實體表中取的數據 105
4.8 聯合結果集 107
4.8.1 簡單的結果集聯合 108
4.8.2 聯合結果集的原則 110
4.8.3 UNION ALL 112
4.8.4 聯合結果集套用舉例 114
第5章 函式 119
5.1 數學函式 122
5.1.1 求絕對值 122
5.1.2 求指數 122
5.1.3 求平方根 123
5.1.4 求隨機數 123
5.1.5 捨入到最大整數 125
5.1.6 捨入到最小整數 126
5.1.7 四捨五入 127
5.1.8 求正弦值 128
5.1.9 求餘弦值 129
5.1.10 求反正弦值 129
5.1.11 求反餘弦值 130
5.1.12 求正切值 130
5.1.13 求反正切值 131
5.1.14 求兩個變數的反正切 131
5.1.15 求餘切 132
5.1.16 求圓周率π值 132
5.1.17 弧度制轉換為角度制 133
5.1.18 角度制轉換為弧度制 134
5.1.19 求符號 134
5.1.20 求整除餘數 135
5.1.21 求自然對數 136
5.1.22 求以10為底的對數 136
5.1.23 求冪 137
5.2 字元串函式 137
5.2.1 計算字元串長度 138
5.2.2 字元串轉換為小寫 138
5.2.3 字元串轉換為大寫 139
5.2.4 截去字元串左側空格 139
5.2.5 截去字元串右側空格 140
5.2.6 截去字元串兩側的空格 141
5.2.7 取子字元串 143
5.2.8 計運算元字元串的位置 144
5.2.9 從左側開始取子字元串 145
5.2.10 從右側開始取子字元串 146
5.2.11 字元串替換 147
5.2.12 得到字元的ASCII碼 148
5.2.13 得到一個ASCII碼數字對應的字元 149
5.2.14 發音匹配度 151
5.3 日期時間函式 153
5.3.1 日期、時間、日期時間與時間戳 153
5.3.2 主流資料庫系統中日期時間類型的表示方式 154
5.3.3 取得當前日期時間 154
5.3.4 日期增減 157
5.3.5 計算日期差額 166
5.3.6 計算一個日期是星期幾 172
5.3.7 取得日期的指定部分 177
5.4 其他函式 183
5.4.1 類型轉換 183
5.4.2 空值處理 188
5.4.3 CASE函式 191
5.5 各資料庫系統獨有函式 194
5.5.1 MySQL中的獨有函式 195
5.5.2 MS SQL Server中的獨有函式 202
5.5.3 Oracle中的獨有函式 206
第6章 索引與約束 209
6.1 索引 209
6.2 約束 211
6.2.1 非空約束 211
6.2.2 唯一約束 212
6.2.3 CHECK約束 217
6.2.4 主鍵約束 221
6.2.5 外鍵約束 224
第7章 表連線 233
7.1 表連線簡介 236
7.2 內連線(INNER JOIN) 236
7.3 不等值連線 240
7.4 交叉連線 241
7.5 自連線 245
7.6 外部連線 248
7.6.1 左外部連線 250
7.6.2 右外部連線 251
7.6.3 全外部連線 252
第8章 子查詢 255
8.1 子查詢入門 261
8.1.1 單值子查詢 261
8.1.2 列值子查詢 263
8.2 SELECT列表中的標量子查詢 265
8.3 WHERE子句中的標量子查詢 267
8.4 集合運算符與子查詢 270
8.4.1 IN運算符 270
8.4.2 ANY和SOME運算符 272
8.4.3 ALL運算符 274
8.4.4 EXISTS運算符 275
8.5 在其他類型SQL語句中的子查詢套用 277
8.5.1 子查詢在INSERT語句中的套用 277
8.5.2 子查詢在UPDATE語句中的套用 283
8.5.3 子查詢在DELETE語句中的套用 285
第9章 主流資料庫的SQL語法差異解決方案 287
9.1 SQL語法差異分析 287
9.1.1 數據類型的差異 287
9.1.2 運算符的差異 288
9.1.3 函式的差異 289
9.1.4 常用SQL的差異 289
9.1.5 取元數據信息的差異 290
9.2 消除差異性的方案 293
9.2.1 為每種資料庫編寫不同的SQL語句 293
9.2.2 使用語法交集 294
9.2.3 使用SQL實體對象 294
9.2.4 使用ORM工具 295
9.2.5 使用SQL翻譯器 296
9.3 CowNewSQL翻譯器 299
9.3.1 CowNewSQL支持的數據類型 299
9.3.2 CowNewSQL支持的SQL語法 300
9.3.3 CowNewSQL支持的函式 305
9.3.4 CowNewSQL的使用方法 309
第10章 高級話題 313
10.1 SQL注入漏洞攻防 313
10.1.1 SQL注入漏洞原理 313
10.1.2 過濾敏感字元 314
10.1.3 使用參數化SQL 315
10.2 SQL調優 316
10.2.1 SQL調優的基本原則 317
10.2.2 索引 317
10.2.3 全表掃描和索引查找 318
10.2.4 最佳化手法 318
10.3 事務 324
10.3.1 事務簡介 324
10.3.2 事務的隔離 325
10.3.3 事務的隔離級別 326
10.3.4 事務的使用 327
10.4 自動增長欄位 327
10.4.1 MySQL中的自動增長欄位 327
10.4.2 MS SQL Server中的自動增長欄位 328
10.4.3 Oracle中的自動增長欄位 329
10.4.4 DB2中的自動增長欄位 332
10.5 業務主鍵與邏輯主鍵 333
10.6 NULL的學問 334
10.6.1 NULL與比較運算符 336
10.6.2 NULL和計算欄位 337
10.6.3 NULL和字元串 338
10.6.4 NULL和函式 339
10.6.5 NULL和聚合函式 339
10.7 開窗函式 340
10.7.1 開窗函式簡介 342
10.7.2 PARTITION BY子句 344
10.7.3 ORDER BY子句 346
10.7.4 高級開窗函式 353
10.8 WITH子句與子查詢 360
第11章 案例講解 363
11.1 報表製作 371
11.1.1 顯示制單人詳細信息 371
11.1.2 顯示銷售單的詳細信息 373
11.1.3 計算收益 374
11.1.4 產品銷售額統計 378
11.1.5 統計銷售記錄的份額 379
11.1.6 為採購單分級 380
11.1.7 檢索所有重疊日期銷售單 383
11.1.8 為查詢編號 385
11.1.9 標記所有單內最大銷售量 386
11.2 排序 389
11.2.1 非欄位排序規則 389
11.2.2 隨機排序 390
11.3 表間比較 391
11.3.1 檢索製作過採購單的人製作的銷售單 391
11.3.2 檢索沒有製作過採購單的人製作的銷售單 392
11.4 表複製 394
11.4.1 複製源表的結構並複製表中的數據 394
11.4.2 只複製源表的結構 395
11.5 計算字元在字元串中出現的次數 396
11.6 去除最高分、最低分 396
11.6.1 去除所有最低、最高值 397
11.6.2 只去除一個最低、最高值 397
11.7 與日期相關的套用 398
11.7.1 計算銷售確認日和制單日之間相差的天數 398
11.7.2 計算兩張銷售單之間的時間間隔 399
11.7.3 計算銷售單制單日期所在年份的天數 401
11.7.4 計算銷售單制單日期所在月份的第一天和最後一天 402
11.8 結果集轉置 403
11.8.1 將結果集轉置為一行 404
11.8.2 把結果集轉置為多行 406
11.9 遞歸查詢 410
11.9.1 Oracle中的CONNECT BY子句 410
11.9.2 Oracle中的SYS_CONNECT_BY_PATH()函式 414
11.9.3 My SQL Server和DB2中遞歸查詢 415
附錄A 常用資料庫系統的安裝和使用 417
A.1 DB2的安裝和使用 417
A.2 MySQL的安裝和使用 429
A.3 Oracle的安裝和使用 441
A.4 Microsoft SQL Server的安裝和使用 452
序言
市面上講解資料庫的書都花了很多篇幅講解資料庫的備份、授權、調優、修復、監控等內容,這些內容是資料庫管理員(DBA)應該掌握的,而對於程式設計師來說更需要掌握的則是SQL語句的使用方法。但是市面上專門講解SQL語句的書非常少,初學者在學習資料庫開發過程中常常被那些寫給DBA的書弄得暈頭轉向,無法真正快速地掌握SQL技術;而且這些書中講解的SQL語句也常常是針對特定資料庫系統的專有實現,無法很容易地在其他資料庫系統中運行,讀者需要閱讀大量的書籍和查閱大量的資料才能掌握不同資料庫系統的使用方法。
本書是專門寫給程式設計師的,因此沒有講解備份、授權、調優、修復、監控等開發人員不關心的內容,直接從SQL語句入手,讓讀者快速掌握資料庫開發的技能。“面向開發人員,講解對開發人員最有用的知識”是本書的編寫宗旨。
MySQL、MS SQL Server、Oracle和DB2等都是非常流行的資料庫管理系統(DBMS),雖然在大部分SQL語法上這些DBMS實現都是一致的,但是在實現細節及高級語法方面這些DBMS的實現差異還是非常大的。如何編寫能夠兼容這些DBMS的SQL語句是開發人員經常需要面對的問題,本書將幫助讀者從根本上解決這個問題。
很多開發人員對於SQL語句的掌握只限於簡單的SELECT、UPDATE語句,對於稍微複雜的邏輯經常需要編寫程式代碼來完成,這不僅無法發揮資料庫的優勢,而且開發出的系統性能也非常低,但如果使用資料庫函式、子查詢、表連線、開窗函式等高級的SQL特性,則可以大大簡化系統開發的難度,並且提高系統的性能。本書將對這些高級特性進行詳細講解。
本書第1、2章介紹資料庫系統的基礎知識及基本操作;第3章介紹INSERT、DELETE和UPDATE語句的基本套用;第4章對SELECT語句進行全面介紹,並對模糊匹配、分組、限制數據條數、計算欄位、組合查詢等高級內容進行了重點講解;第5章介紹常用的資料庫函式及它們在主流DBMS中的實現差異;第6章介紹索引與約束等知識點;第7、8章分別介紹表連線、子查詢等高級查詢技術;第9章對主流DBMS的語法差異進行分析,並且給出了解決方案;第10章介紹注入漏洞攻擊、SQL調優、事務、自動增長欄位、NULL值處理、開窗函式等高級話題;第11章以一個綜合案例講解書中知識點在實際開發中的套用。
在此,我要感謝為這本書的誕生給予幫助的所有人。首先要感謝CowNew開源團隊的朋友們一直以來的無私奉獻;感謝KingChou在開發CowNewSQL過程中的卓越工作,沒有CowNewSQL也就不會有這本書的問世;還要感謝EasyJF的蔡世友,他一直以來對開源事業的奉獻是值得我學習的;最後我要感謝電子工業出版社的田小康,他的高效工作使得本書能夠順利完成和出版。