本書詳細介紹了Oracle、MySQL、PostgreSQL、SQL Server、DB2等各種關(guān)系數(shù)據(jù)庫的SQL查詢技巧和一些基礎(chǔ)的SQL查詢語句,并且通過短小精悍的實例,不僅講解了如何插入、更新和刪除數(shù)據(jù),還介紹了如何檢索記錄、為查詢結(jié)果排序、同時操作多張數(shù)據(jù)庫表、查詢元數(shù)據(jù)、處理涉及字符串和數(shù)值的操作、根據(jù)時間數(shù)據(jù)和日期數(shù)據(jù)進行運算、執(zhí)行層次查詢和區(qū)間查詢等。隨著多種SQL實現(xiàn)大量采用窗口函數(shù),本書第2版針對相關(guān)實例做了優(yōu)化,還新增了為數(shù)據(jù)科學(xué)家和算法工程師量身定制的實例。
1.第二版升級更新,巧妙應(yīng)對160余個SQL使用場景;
2.實例短小精悍,涵蓋5種主流的關(guān)系數(shù)據(jù)庫:Oracle、MySQL、PostgreSQL、SQL Server、DB2等;
3.數(shù)據(jù)分析師常備案頭書。
你或許熟悉SQL基礎(chǔ)知識,但能否充分發(fā)揮它的強大威力呢?本書從實戰(zhàn)角度展示SQL在查詢之外的能力。你將學(xué)會用SQL進行統(tǒng)計分析,像使用商業(yè)智能工具那樣制作報表,進行文本數(shù)據(jù)匹配,以及執(zhí)行復(fù)雜的日期數(shù)據(jù)分析。本書的寫作方式獨樹一幟,以160余個真實場景為例,提供了讓你耳目一新的解決方案。書中的實例短小精悍,涵蓋5種主流的關(guān)系數(shù)據(jù)庫:Oracle、MySQL、SQL Server、PostgreSQL和DB2。
數(shù)據(jù)分析師、數(shù)據(jù)科學(xué)家和數(shù)據(jù)庫管理員可以通過本書練習(xí)解決SQL問題的能力,并開拓思路。對于其他需要在日常工作中與SQL打交道的讀者,本書也是彌足珍貴的參考書,有助于快速查找解決方案。
本書第2版做了如下更新。
●修訂了原有實例,幫助你鞏固基礎(chǔ)知識并充分利用各個SQL實現(xiàn)引入的窗口函數(shù)
●新增了一些實例,旨在幫助你采用可讀性更強、更容易實現(xiàn)的通用表表達式(CTE)
●為非數(shù)據(jù)庫專家(如數(shù)據(jù)科學(xué)家)量身定制了一些實例
●擴展了處理數(shù)字和字符串的解決方案
●包含更多標準解決方案
安東尼·莫利納羅(Anthony Molinaro),美國強生公司數(shù)據(jù)科學(xué)家,專精SQL技術(shù),擅長解決棘手的SQL問題,對關(guān)系理論有深入研究。
羅伯特·德·格拉夫(Robert de Graaf),RightShip公司數(shù)據(jù)科學(xué)家,負責(zé)為公司設(shè)計和開發(fā)用于預(yù)測性分析的算法,另著有Managing Your Data Science Projects。
【譯者介紹】
袁國忠,自由譯者,20多年專職翻譯經(jīng)驗,主譯圖書,偶譯新聞稿、軟文;出版譯著40余部,其中包括《Python編程從入門到實踐》《C++ Prime Plus中文版》《Python基礎(chǔ)教程(第3版)》《算法圖解》《面向模式的軟件架構(gòu):模式系統(tǒng)》《風(fēng)投的選擇:誰是下一個十億美元級公司》等,總計700余萬字;專事翻譯前,做過兩年雜志和圖書編輯,從事過三年化工產(chǎn)品開發(fā)和分析工作。
前言xi
第 1 章 檢索記錄 1
1.1 檢索表中所有的行和列 1
1.2 從表中檢索部分行 2
1.3 查找滿足多個條件的行 2
1.4 從表中檢索部分列 3
1.5 提供有意義的列名 3
1.6 在WHERE子句中使用別名來引用列 4
1.7 拼接列值 5
1.8 在SELECT語句中使用條件邏輯 6
1.9 限制返回的行數(shù) 7
1.10 從表中隨機返回n行數(shù)據(jù) 8
1.11 查找NULL值 9
1.12 將NULL轉(zhuǎn)換為實際值 10
1.13 模式查找 10
1.14 小結(jié) 11
第 2 章 查詢結(jié)果排序 12
2.1 按指定順序返回查詢結(jié)果 12
2.2 按多字段排序 13
2.3 按子串排序 14
2.4 對同時包含字母和數(shù)字的數(shù)據(jù)進行排序 15
2.5 排序時處理NULL值 17
2.6 根據(jù)依賴于數(shù)據(jù)的鍵進行排序 23
2.7 小結(jié) 24
第 3 章 使用多張表 25
3.1 合并多個行集 25
3.2 合并相關(guān)的行 27
3.3 查找兩張表中相同的行 28
3.4 從一張表中檢索沒有出現(xiàn)在另一張表中的值 30
3.5 從一張表中檢索在另一張表中沒有對應(yīng)行的行 34
3.6 在查詢中添加連接并確保不影響其他連接 36
3.7 判斷兩張表包含的數(shù)據(jù)是否相同 38
3.8 識別并避免笛卡兒積 44
3.9 同時使用連接和聚合 45
3.10 同時使用外連接和聚合 49
3.11 返回多張表中不匹配的行 51
3.12 在運算和比較中使用NULL 55
3.13 小結(jié) 55
第 4 章 插入、更新和刪除 56
4.1 插入新記錄 56
4.2 插入默認值 57
4.3 用NULL覆蓋默認值 58
4.4 將一張表中的行復(fù)制到另一張表中 59
4.5 復(fù)制表定義 59
4.6 同時插入多張表 60
4.7 禁止在特定列中插入值 62
4.8 修改表中的記錄 63
4.9 僅當(dāng)存在匹配行時才更新 64
4.10 使用來自另一張表中的值進行更新 64
4.11 合并記錄 67
4.12 刪除表中的所有記錄 69
4.13 刪除特定記錄 69
4.14 刪除單條記錄 70
4.15 刪除違反引用完整性的記錄 70
4.16 刪除重復(fù)記錄 71
4.17 刪除在另一張表中引用了的記錄 72
4.18 小結(jié) 73
第 5 章 元數(shù)據(jù)查詢 74
5.1 列出模式中的所有表 74
5.2 列出表中的列 75
5.3 列出表的索引列 76
5.4 列出表的約束 77
5.5 列出沒有相應(yīng)索引的外鍵 78
5.6 使用SQL生成SQL 81
5.7 描述Oracle數(shù)據(jù)庫中的數(shù)據(jù)字典視圖 83
5.8 小結(jié) 84
第 6 章 處理字符串 85
6.1 走查字符串 85
6.2 在字符串字面量中嵌入引號 87
6.3 計算字符串中特定字符出現(xiàn)的次數(shù) 88
6.4 將不想要的字符從字符串中刪除 89
6.5 將數(shù)字數(shù)據(jù)和字符數(shù)據(jù)分開 90
6.6 判斷字符串是否只包含字母和數(shù)字 94
6.7 提取姓名中的首字母 98
6.8 根據(jù)部分字符串排序 101
6.9 根據(jù)字符串中的數(shù)字排序 103
6.10 根據(jù)表中的行創(chuàng)建分隔列表 108
6.11 將分隔數(shù)據(jù)轉(zhuǎn)換為多值IN列表 111
6.12 按字母順序排列字符串中的字符 116
6.13 識別可視為數(shù)字的字符串 120
6.14 提取第n個子串 125
6.15 拆分IP地址 131
6.16 根據(jù)發(fā)音比較字符串 133
6.17 查找與模式不匹配的文本 134
6.18 小結(jié) 137
第 7 章 處理數(shù)字 138
7.1 計算平均值 138
7.2 找出最大列值和最小列值 140
7.3 計算列值總和 142
7.4 計算表中的行數(shù) 143
7.5 計算非NULL列值數(shù) 145
7.6 生成移動總計 145
7.7 生成移動總積 147
7.8 平滑值序列 148
7.9 計算眾數(shù) 149
7.10 計算中值 151
7.11 計算總計占比 153
7.12 聚合值可為NULL的列 155
7.13 計算剔除最高值和最低值后的平均值 156
7.14 將由字母和數(shù)字組成的字符串轉(zhuǎn)換為數(shù)字 158
7.15 修改移動總計中的值 60
7.16 使用絕對中位差找出異常值 161
7.17 使用本福特法則查找反常數(shù)據(jù) 164
7.18 小結(jié) 166
第 8 章 日期算術(shù)運算 167
8.1 加上或減去若干天、若干月或若干年 167
8.2 確定兩個日期相差多少天 169
8.3 確定兩個日期之間有多少個工作日 171
8.4 確定兩個日期相隔多少個月或多少年 175
8.5 確定兩個日期相隔多少秒、多少分鐘或多少小時 178
8.6 計算一年中有多少個工作日 179
8.7 確定當(dāng)前記錄和下一條記錄存儲的日期相隔多少天 190
8.8 小結(jié) 194
第 9 章 操作日期 195
9.1 判斷特定的年份是否是閏年 195
9.2 確定特定年份有多少天 201
9.3 提取日期的各個組成部分 203
9.4 找出一個月的第 一天和最后一天 205
9.5 找出一年中所有的星期n 207
9.6 找出一個月中第 一個和最后一個星期n 213
9.7 創(chuàng)建日歷 219
9.8 列出一年中各個季度的第 一天和最后一天 230
9.9 確定給定季度的第 一天和最后一天 234
9.10 補全缺失的日期 240
9.11 根據(jù)日期的特定部分進行查找 247
9.12 根據(jù)日期的特定部分對記錄進行比較 248
9.13 找出重疊的日期范圍 251
9.14 小結(jié) 256
第 10 章 涉及區(qū)間的查詢 257
10.1 找出一系列連續(xù)的值 257
10.2 找出同一個分組或分區(qū)中相鄰行的差 260
10.3 找出連續(xù)值構(gòu)成的區(qū)間的起點和終點 265
10.4 填補值區(qū)間空隙 268
10.5 生成連續(xù)的數(shù)字值 271
10.6 小結(jié) 274
第 11 章 高級查找 275
11.1 在結(jié)果集中翻頁 275
11.2 在表中跳過n行數(shù)據(jù) 277
11.3 在外連接中使用OR邏輯 279
11.4 確定哪些行是互逆的 280
11.5 返回前n條記錄 282
11.6 找出值最高和最低的記錄 283
11.7 查看后面的行 284
11.8 平移行值 286
11.9 結(jié)果排名 288
11.10 消除重復(fù)行 289
11.11 查找馬值 291
11.12 生成簡單預(yù)測 296
11.13 小結(jié) 303
第 12 章 報表制作和整形 304
12.1 將結(jié)果集轉(zhuǎn)置為一行 304
12.2 將結(jié)果集轉(zhuǎn)置為多行 306
12.3 對結(jié)果集進行逆轉(zhuǎn)置 311
12.4 將結(jié)果集逆轉(zhuǎn)置為一列 312
12.5 消除結(jié)果集中的重復(fù)值 315
12.6 轉(zhuǎn)置結(jié)果集以簡化涉及多行的計算 317
12.7 創(chuàng)建尺寸固定的數(shù)據(jù)桶 319
12.8 創(chuàng)建預(yù)定數(shù)量的桶 321
12.9 創(chuàng)建水平直方圖 322
12.10 創(chuàng)建垂直直方圖 323
12.11 返回未被用作分組依據(jù)的列 325
12.12 計算簡單的小計 327
12.13 計算各種可能的小計 331
12.14 標出非小計行 340
12.15 使用CASE表達式來標識行 341
12.16 創(chuàng)建稀疏矩陣 343
12.17 按時間分組 344
12.18 同時對不同的分組/分區(qū)進行聚合 348
12.19 聚合移動值區(qū)間 349
12.20 轉(zhuǎn)置包含小計的結(jié)果集 356
12.21 小結(jié) 360
第 13 章 分層查詢 361
13.1 呈現(xiàn)父子關(guān)系 362
13.2 呈現(xiàn)子–父–祖父關(guān)系 365
13.3 創(chuàng)建基于表的分層視圖 369
13.4 找出給定父行的所有子行 373
13.5 確定葉子節(jié)點、分支節(jié)點和根節(jié)點 374
13.6 小結(jié) 381
第 14 章 雜項 382
14.1 使用SQL Server運算符PIVOT創(chuàng)建交叉報表 382
14.2 使用SQL Server運算符UNPIVOT逆轉(zhuǎn)置交叉報表 384
14.3 使用Oracle子句MODEL轉(zhuǎn)置結(jié)果集 386
14.4 從不固定的位置提取子串 389
14.5 確定特定年份有多少天(另一種Oracle解決方案) 391
14.6 找出同時包含字母和數(shù)字的字符串 393
14.7 在Oracle中將整數(shù)轉(zhuǎn)換為其二進制表示 395
14.8 對經(jīng)過排名的結(jié)果集進行轉(zhuǎn)置 397
14.9 給經(jīng)過兩次轉(zhuǎn)置的結(jié)果集添加列標題 401
14.10 在Oracle中將標量子查詢轉(zhuǎn)換為復(fù)合子查詢 412
14.11 將序列化數(shù)據(jù)轉(zhuǎn)換為行 414
14.12 計算占總計的百分比 418
14.13 確定編組是否包含指定的值 419
14.14 小結(jié) 422
附錄A 溫習(xí)窗口函數(shù) 423
附錄B 通用表表達式 446