本書是熱銷書《SQL基礎(chǔ)教程》的作者M(jìn)ICK為志在向中級(jí)進(jìn)階的數(shù)據(jù)庫(kù)工程師編寫的一本SQL技能提升指南。全書可分為兩大部分。第一部分介紹了SQL語言不同尋常的使用技巧,帶領(lǐng)讀者重新認(rèn)識(shí)CASE表達(dá)式、窗口函數(shù)、自連接、EXISTS謂詞、HAVING子句、外連接、行間比較、集合運(yùn)算、數(shù)列處理等SQL常用技術(shù),發(fā)掘它們的新用法。這部分不僅穿插講解了這些技巧背后的邏輯和相關(guān)知識(shí),而且輔以豐富的示例程序,旨在幫助讀者從面向過程的思維方式轉(zhuǎn)換為面向集合的思維方式。第二部分介紹了關(guān)系數(shù)據(jù)庫(kù)的發(fā)展史,并從集合論和邏輯學(xué)的角度講述了SQL和關(guān)系模型的理論基礎(chǔ),旨在幫助讀者加深對(duì)SQL語言和關(guān)系數(shù)據(jù)庫(kù)的理解。此外,本書很多節(jié)的末尾設(shè)置有練習(xí)題,并在書末提供了解答,方便讀者檢驗(yàn)自己對(duì)書中知識(shí)點(diǎn)的掌握程度。
1.進(jìn)階中級(jí)實(shí)用指南!160張圖表+412段代碼,掌握面向集合思維,發(fā)掘SQL常見技術(shù)的新用法
2.基于標(biāo)準(zhǔn)SQL編寫,示例程序均可下載
3.深入淺出,示例豐富,轉(zhuǎn)變面向過程語言思維定式,切實(shí)提升SQL編程水平
4.解析經(jīng)典文獻(xiàn),導(dǎo)入邏輯學(xué)與集合論,深刻理解SQL底層邏輯
5.基于各DBMS新版本新升級(jí),內(nèi)容更新更全面,詳解現(xiàn)代SQL新功能
MICK(作者)
日本資歷深厚的數(shù)據(jù)庫(kù)工程師,就職于某系統(tǒng)集成商,致力于數(shù)據(jù)倉(cāng)庫(kù)和商業(yè)智能的開發(fā)。日常除了在其個(gè)人主頁(yè)“關(guān)系數(shù)據(jù)庫(kù)的世界”中分享數(shù)據(jù)庫(kù)和SQL的相關(guān)技術(shù)信息外,還為翔泳社的網(wǎng)絡(luò)媒體CodeZine和日本IT技術(shù)雜志W(wǎng)EB+DB PRESS撰寫技術(shù)文章,同時(shí)還是《SQL解惑(第2版)》和《SQL權(quán)威指南(第4版)》日文版的譯者
吳炎昌(譯者)
畢業(yè)于西北工業(yè)大學(xué)軟件工程專業(yè)。曾供職于日本多家軟件公司,從事系統(tǒng)開發(fā)工作。2015年回國(guó)后加入美團(tuán)點(diǎn)評(píng),現(xiàn)任系統(tǒng)研發(fā)工程師。愛好旅行、電影,以及品嘗各種美食,有一位志趣相投的伴侶。
侯振龍(譯者)
管理科學(xué)與工程專業(yè)碩士,日語一級(jí),軟件開發(fā)工程師,具有十年以上對(duì)日軟件開發(fā)經(jīng)驗(yàn),現(xiàn)就職于某日本獨(dú)資企業(yè)。
第 1章 神奇的SQL 1
1-1 CASE表達(dá)式 2
在SQL里表達(dá)條件分支
寫在前面 2
CASE表達(dá)式的寫法 2
將已有編號(hào)方式轉(zhuǎn)換為新的方式并統(tǒng)計(jì) 4
用一條SQL語句進(jìn)行多條件統(tǒng)計(jì) 7
用CHECK約束定義多個(gè)列的條件關(guān)系 11
在UPDATE語句里進(jìn)行條件分支 12
表之間的數(shù)據(jù)匹配 15
在CASE表達(dá)式中使用聚合函數(shù) 17
本節(jié)小結(jié) 20
練習(xí)題 22
1-2 必知必會(huì)的窗口函數(shù) 25
順序編程的復(fù)活
什么是窗口 26
一張圖看懂窗口函數(shù) 27
使用幀子句將其他行移至當(dāng)前行 29
窗口函數(shù)的內(nèi)部動(dòng)作 34
本節(jié)小結(jié) 37
練習(xí)題 39
1-3 自連接的用法 41
從物理到邏輯的跳躍
可重排列、排列、組合 41
刪除重復(fù)行 45
查找局部不一致的列 48
本節(jié)小結(jié) 50
練習(xí)題 55
1-4 三值邏輯和NULL 56
SQL的溫柔陷阱
寫在前面 56
理論篇 57
實(shí)踐篇 61
本節(jié)小結(jié) 71
練習(xí)題 78
1-5 EXISTS 謂詞的用法 79
SQL中的謂詞邏輯
寫在前面 79
理論篇 79
實(shí)踐篇 85
本節(jié)小結(jié) 95
練習(xí)題 96
1-6 HAVING 子句的力量 99
將世界看作集合
尋找缺失的編號(hào) 99
用HAVING 子句進(jìn)行子查詢:求眾數(shù) 105
查詢不包含NULL 的集合 107
特征函數(shù)的應(yīng)用 110
使用HAVING 語句表達(dá)全稱量化 113
單重集合與多重集合 116
用關(guān)系除法運(yùn)算進(jìn)行購(gòu)物籃分析 120
本節(jié)小結(jié) 123
練習(xí)題 128
1-7 用窗口函數(shù)進(jìn)行行間比較 130
告別關(guān)聯(lián)子查詢
寫在前面 130
增加、減少、沒有變化 130
時(shí)間軸有間斷時(shí):和過去最臨近的時(shí)間進(jìn)行比較 135
窗口函數(shù)與關(guān)聯(lián)子查詢 137
查詢重疊的時(shí)間區(qū)間 140
本節(jié)小結(jié) 145
練習(xí)題 145
1-8 外連接的用法 147
SQL的弱點(diǎn)及其趨勢(shì)和對(duì)策
寫在前面 147
用外連接進(jìn)行行列轉(zhuǎn)換(1)(行→列):制作交叉表 147
用外連接進(jìn)行行列轉(zhuǎn)換(2)(列→行):匯總重復(fù)項(xiàng)于一列 151
在交叉表里制作嵌套式表側(cè)欄 153
作為乘法運(yùn)算的連接 158
全外連接 160
用外連接進(jìn)行集合運(yùn)算 163
用外連接求差集:A - B 163
用外連接求差集:B。 A 164
用全外連接求異或集 165
本節(jié)小結(jié) 166
練習(xí)題 168
1-9 用SQL 進(jìn)行集合運(yùn)算 170
SQL和集合論
寫在前面 170
導(dǎo)入篇:集合運(yùn)算的幾個(gè)注意事項(xiàng) 170
比較表和表:檢查集合相等性之基礎(chǔ)篇 172
比較表和表:檢查集合相等性之進(jìn)階篇 175
用差集實(shí)現(xiàn)關(guān)系除法運(yùn)算 177
尋找相等的子集 180
用于刪除重復(fù)行的高效SQL 183
本節(jié)小結(jié) 185
練習(xí)題 187
1-10 用SQL 處理數(shù)列 188
用SQL 處理有序數(shù)據(jù)——集大成
寫在前面 188
生成連續(xù)編號(hào) 188
求全部的缺失編號(hào) 192
3 個(gè)人能坐得下嗎 194
有換排的數(shù)列 197
單調(diào)遞增和單調(diào)遞減 199
本節(jié)小結(jié) 202
練習(xí)題 204
1-11 讓SQL 飛起來 205
簡(jiǎn)單的SQL性能優(yōu)化
寫在前面 205
使用高效的查詢 205
避免排序 208
真的用到索引了嗎 213
減少中間表 216
本節(jié)小結(jié) 218
1-12 SQL 編程方法 220
確立SQL 的編程風(fēng)格
寫在前面 220
表的設(shè)計(jì) 222
編程的方針 223
SQL 編程方法 230
本節(jié)小結(jié) 234
第 2章 關(guān)系數(shù)據(jù)庫(kù)的世界 237
2-1 關(guān)系數(shù)據(jù)庫(kù)的近現(xiàn)代史 238
數(shù)據(jù)庫(kù)有過兩次破壞性創(chuàng)新嗎
關(guān)系數(shù)據(jù)庫(kù)的歷史 238
破壞性創(chuàng)新會(huì)重復(fù)嗎 243
NoSQL 的類型和解決方案 245
性能問題的解決方案 245
本節(jié)小結(jié) 247
2-2 為什么叫“關(guān)系”模型 250
為什么不叫“表”模型
關(guān)系的定義 250
定義域的憂慮 253
關(guān)系值和關(guān)系變量 254
存在“關(guān)系的關(guān)系”嗎 255
2-3 開始于關(guān)系,結(jié)束于關(guān)系 257
關(guān)于封閉世界的幸福
從運(yùn)算角度審視集合 257
實(shí)踐和原理 259
2-4 地址:巨大的怪物 261
為什么關(guān)系數(shù)據(jù)庫(kù)里沒有指針
寫在前面 261
關(guān)系模型是為擺脫地址而生的 262
編程中泛濫的地址 263
不曾遠(yuǎn)去的老將——約翰·巴克斯的夢(mèng)想 265
2-5 關(guān)于順序的冒險(xiǎn) 266
SQL的中心法則
遲來的主角 266
行應(yīng)該有順序嗎 267
2-6 GROUP BY 和PARTITION BY 271
物以“類”聚
二者的區(qū)別 271
2-7 從面向過程思維向聲明式思維、面向集合思維轉(zhuǎn)變的7個(gè)關(guān)鍵點(diǎn) 276
畫圓
寫在前面 276
1. 用CASE 表達(dá)式代替IF 語句和CASE 語句。SQL 更像一種函數(shù)式語言 277
2. 用GROUP BY 和窗口函數(shù)代替循環(huán) 278
3. 表中的行沒有順序 279
4. 將表看成集合 280
5. 理解EXISTS 謂詞和“量化”的概念 280
6. 學(xué)習(xí)HAVING 子句的真正價(jià)值 281
7. 不要畫長(zhǎng)方形,去畫圓 282
2-8 人類的邏輯學(xué) 284
淺談邏輯學(xué)的歷史
適當(dāng)?shù)貟侀_命題的真假吧 284
邏輯學(xué)的革命 286
人類的邏輯學(xué) 287
2-9 SQL 和遞歸集合 288
SQL和集合論的緊密關(guān)系
實(shí)際工作中的遞歸集合 288
馮·諾依曼的前輩們 288
數(shù)是什么 290
SQL 的魔術(shù)與科學(xué) 293
2-10 消滅NULL 委員會(huì) 294
全世界的數(shù)據(jù)庫(kù)工程師團(tuán)結(jié)起來
表明決心:告全體數(shù)據(jù)庫(kù)工程師書 294
為什么NULL 如此惹人討厭 294
并不能完全消除NULL 296
編號(hào):使用異常編號(hào) 297
名字:使用“無名氏” 297
數(shù)值:用0 代替 298
日期:用最大值或最小值代替 298
本節(jié)小結(jié) 299
2-11 SQL 中的層級(jí) 300
嚴(yán)格的等級(jí)社會(huì)
謂詞邏輯中的層級(jí)、集合論中的層級(jí) 300
為什么聚合后不能再引用原表中的列 300
單元素集合也是集合 304
第3章 附錄 307
3-1 習(xí)題解答 308
3-2 參考文獻(xiàn) 331
SQL 整體 331
數(shù)據(jù)庫(kù)設(shè)計(jì) 332
性能 333
集合論和謂詞邏輯/三值邏輯 333
后記 335