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