出版時(shí)間:2009-11 出版社:人民郵電出版社 作者:Joe Celko 頁(yè)數(shù):270 譯者:馬樹(shù)奇
Tag標(biāo)簽:無(wú)
前言
本書(shū)討論的是使用表而不是過(guò)程式代碼的各種SQL編程技術(shù)。我一直跟大家說(shuō),學(xué)習(xí)SQL編程最重要的就是要摒棄原有的過(guò)程式編程,但對(duì)于那些一直都在以文件和過(guò)程代碼的方式來(lái)思考的人們而言,僅僅這樣說(shuō)不行,還得具體說(shuō)明如何采用聲明式關(guān)系語(yǔ)言來(lái)完成相關(guān)工作。因此我編寫了本書(shū),展示實(shí)際技術(shù),闡述思想方式?! ∨c我的其他作品相同,本書(shū)的讀者對(duì)象是那些希望掌握良好SQL編程技術(shù)的專業(yè)SQL程序員。本書(shū)假定讀者對(duì)SQL語(yǔ)言足夠了解,已經(jīng)能夠編寫可以運(yùn)行的代碼,具有一年的SQL使用經(jīng)驗(yàn)?! 槭裁葱枰哂幸荒甑慕?jīng)驗(yàn)?zāi)兀课彝ㄟ^(guò)幾十年講授SQL課程發(fā)現(xiàn),大多數(shù)人在由過(guò)程式編程語(yǔ)言(如FORTRAN、Cobol、Pascal、C系列語(yǔ)言)、面向?qū)ο缶幊陶Z(yǔ)言等轉(zhuǎn)向SQL語(yǔ)言時(shí),都要經(jīng)過(guò)多個(gè)階段,而這段時(shí)間基本為一年。聲明式語(yǔ)言與他們此前使用的所有編程語(yǔ)言都不相同?! W(xué)習(xí)一門新的編程語(yǔ)言就如同學(xué)習(xí)一門外語(yǔ)。一開(kāi)始,人們會(huì)念錯(cuò)單詞,并且總想使用自己母語(yǔ)的詞序和語(yǔ)法。接下來(lái),人們會(huì)通過(guò)努力,根據(jù)一種固定模式來(lái)正確地造句。最后,人們才能輕松地以該語(yǔ)言來(lái)思考和表述,并且不需要再刻意關(guān)注語(yǔ)言本身?! QL編程的初級(jí)階段只不過(guò)是閉著眼睛從別人的程序中把現(xiàn)有的代碼復(fù)制過(guò)來(lái),這并不是真正的編程。人們可能還會(huì)使用一種具有圖形用戶界面的工具來(lái)從文本文件中把SQL語(yǔ)句組合起來(lái),甚至根本不需要顯示自己的實(shí)際代碼。
內(nèi)容概要
《SQL沉思錄》通過(guò)大量的實(shí)例,詳細(xì)說(shuō)明了為提高SQL編程技術(shù)而必須面對(duì)的思想方法上的根本轉(zhuǎn)變——由以過(guò)程式編程方式思考轉(zhuǎn)變?yōu)橐詳?shù)據(jù)集的方式來(lái)思考。此外,《SQL沉思錄》還討論了關(guān)于SQL編程中查找表、視圖、輔助表、虛擬表的應(yīng)用,并獨(dú)到地闡明了如何在SQL系統(tǒng)中正確地處理時(shí)間值以及SQL編程中的其他技術(shù)難點(diǎn)?! 禨QL沉思錄》適合廣大數(shù)據(jù)庫(kù)編程人員和SQL程序員學(xué)習(xí)參考。
作者簡(jiǎn)介
Joe Celko,世界著名的數(shù)據(jù)庫(kù)專家,曾擔(dān)任ANSI SQL標(biāo)準(zhǔn)委員會(huì)成員達(dá)10年之久,他也是世界上讀者數(shù)量最多的SQL圖書(shū)作者之一。他曾撰寫過(guò)一系列專欄,并通過(guò)他的新聞組支持和推動(dòng)了數(shù)據(jù)庫(kù)編程技術(shù)以及ANSI/ISO標(biāo)準(zhǔn)的發(fā)展。除本書(shū)外,他還撰寫了多部SQL經(jīng)典著作,包括《SQL編程風(fēng)格》、《SQL解惑》和《SQL權(quán)威指南》,上述作品的中文版均已經(jīng)或即將由人民郵電出版社出版。
書(shū)籍目錄
第1章 SQL是聲明式語(yǔ)言,不是過(guò)程式語(yǔ)言 11.1 不同的編程模型 11.2 不同的數(shù)據(jù)模型 31.2.1 “列”不是“字段” 41.2.2 行不是記錄 61.2.3 表不是文件 91.2.4 關(guān)系鍵不是記錄定位器 111.2.5 鍵的類型 121.2.6 關(guān)系鍵的理想屬性 141.2.7 唯一,但并非不變 151.3 表作為實(shí)體 151.4 表作為關(guān)系 161.5 語(yǔ)句不是過(guò)程 161.6 分子、原子和亞原子型數(shù)據(jù)元素 171.6.1 分割表 171.6.2 分割列 181.6.3 時(shí)間值的分割 191.6.4 假造的非第一范式數(shù)據(jù) 191.6.5 分子型數(shù)據(jù)元素 211.6.6 異構(gòu)數(shù)據(jù)元素 211.6.7 檢驗(yàn)分子型數(shù)據(jù) 22第2章 硬件、數(shù)據(jù)量和維護(hù)數(shù)據(jù)庫(kù) 232.1 并行處理技術(shù) 232.2 廉價(jià)的主存儲(chǔ)器 252.3 固態(tài)磁盤 252.4 更廉價(jià)的二級(jí)存儲(chǔ)器和三級(jí)存儲(chǔ)器 252.5 數(shù)據(jù)也在改變 262.6 思維方式并未改變 26第3章 數(shù)據(jù)訪問(wèn)和記錄 293.1 順序訪問(wèn) 293.2 索引 303.2.1 單表索引 313.2.2 多表索引 313.2.3 索引的類型 323.3 散列 323.3.1 數(shù)字選擇 333.3.2 除法散列 333.3.3 乘法散列 333.3.4 合并 333.3.5 表的查找 333.3.6 沖突 343.4 位向量索引 343.5 并行訪問(wèn) 343.6 行和列存儲(chǔ) 353.6.1 基于行的存儲(chǔ) 353.6.2 基于列的存儲(chǔ) 353.7 聯(lián)結(jié)算法 363.7.1 嵌套循環(huán)聯(lián)結(jié)算法 373.7.2 排序合并聯(lián)結(jié)算法 373.7.3 散列聯(lián)結(jié)算法 373.7.4 Shin算法 38第4章 查找表 394.1 數(shù)據(jù)元素的名稱 404.2 多參數(shù)查找表 424.3 常量表 434.4 OTLT或MUCK表問(wèn)題 454.5 正確表的定義 48第5章 輔助表 495.1 序列表 495.1.1 創(chuàng)建序列表 515.1.2 序列構(gòu)造器 515.1.3 替換迭代循環(huán) 525.2 排列 545.2.1 通過(guò)遞歸進(jìn)行排列 545.2.2 通過(guò)CROSS JOIN進(jìn)行排列 555.3 函數(shù) 575.4 通過(guò)表實(shí)現(xiàn)加密 595.5 隨機(jī)數(shù) 605.6 插值 63第6章 視圖 666.1 Mullins視圖使用原則 666.1.1 高效訪問(wèn)和計(jì)算 676.1.2 重命名列 686.1.3 避免增生 686.1.4 視圖同步原則 686.2 可更新視圖和只讀視圖 696.3 視圖的類型 716.3.1 單表投影和限制 716.3.2 計(jì)算列 716.3.3 轉(zhuǎn)換列 726.3.4 分組視圖 726.3.5 聯(lián)合視圖 736.3.6 視圖的聯(lián)結(jié) 746.3.7 嵌套視圖 756.4 用表構(gòu)建類模型 766.4.1 SQL中類的層次結(jié)構(gòu) 776.4.2 通過(guò)ASSERTION和TRIGER工作的子類 796.5 數(shù)據(jù)庫(kù)系統(tǒng)如何處理視圖 796.5.1 視圖列的列表 796.5.2 視圖的物化 806.6 嵌入式文本擴(kuò)展 806.7 WITH CHECK OPTION子句 816.8 刪除視圖 866.9 過(guò)時(shí)的視圖用法 876.9.1 域的支持 876.9.2 表表達(dá)式視圖 886.9.3 表級(jí)CHECK()約束的視圖 886.9.4 每個(gè)基表一個(gè)視圖 88第7章 虛擬表 907.1 派生表 907.1.1 列的命名規(guī)則 917.1.2 作用域規(guī)則 917.1.3 公開(kāi)的表名 937.1.4 LATERAL()子句 947.2 CTE 967.2.1 非遞歸CTE 967.2.2 遞歸CTE 977.3 臨時(shí)表 987.3.1 ANSI/ISO標(biāo)準(zhǔn) 997.3.2 廠商的模型 997.4 信息模式 997.4.1 INFORMATION_SCHEMA聲明 1007.4.2 視圖及其用途的快速列表 1017.4.3 域的聲明 1027.4.4 定義模式 1027.4.5 INFORMATION_SCHEMA斷言 105第8章 用表實(shí)現(xiàn)的復(fù)雜函數(shù) 1068.1 沒(méi)有簡(jiǎn)單公式的函數(shù) 1068.2 用表實(shí)現(xiàn)校驗(yàn)位 1078.2.1 校驗(yàn)位的定義 1078.2.2 檢錯(cuò)與糾錯(cuò)的對(duì)比 1088.3 算法的分類 1098.3.1 加權(quán)和算法 1098.3.2 冪和校驗(yàn)位 1118.3.3 Luhn算法 1128.3.4 Dihedral Five校驗(yàn)位 1138.4 聲明不是函數(shù),不是過(guò)程 1148.5 用于輔助表的數(shù)據(jù)挖掘 118第9章 時(shí)態(tài)表 1209.1 時(shí)間的本質(zhì) 1209.1.1 時(shí)間段,不是時(shí)間子 1219.1.2 細(xì)分程度 1229.2 ISO半開(kāi)放時(shí)間模型 1239.2.1 用NULL表示永遠(yuǎn) 1259.2.2 單時(shí)間戳表 1259.2.3 重疊的時(shí)間間隔 1279.3 狀態(tài)轉(zhuǎn)換表 1349.4 合并時(shí)間間隔 1389.4.1 游標(biāo)和觸發(fā)器 1399.4.2 OLAP函數(shù)解決方案 1409.4.3 CTE解決方案 1419.5 Calendar表 1429.5.1 用表提供星期值 1429.5.2 節(jié)假日列表 1439.5.3 報(bào)告期 1459.5.4 自更新視圖 1459.6 歷史表 147第10章 用非第一范式表清理數(shù)據(jù) 14910.1 重復(fù)的組 14910.2 設(shè)計(jì)清理表 15510.3 清理操作使用的約束 15710.4 日歷清理 15810.5 字符串清理 15910.6 共享SQL數(shù)據(jù) 16110.6.1 數(shù)據(jù)的發(fā)展 16210.6.2 數(shù)據(jù)庫(kù) 16210.7 提取、轉(zhuǎn)換和加載產(chǎn)品 16310.7.1 加載數(shù)據(jù)倉(cāng)庫(kù) 16410.7.2 全部用SQL來(lái)完成 16510.7.3 提取、轉(zhuǎn)換并加載 166第11章 以SQL的方式思考 16811.1 熱身練習(xí) 16811.1.1 整體,不是部分 16911.1.2 特征函數(shù) 16911.1.3 盡早鎖定解決方案 17111.2 啟發(fā)式方法 17211.2.1 將規(guī)范表達(dá)為清晰的語(yǔ)句 17211.2.2 在名詞前面添加“所有……的集合”幾個(gè)字 17211.2.3 刪除問(wèn)題語(yǔ)句中的行為動(dòng)詞 17311.2.4 仍然可以使用存根 17311.2.5 不要擔(dān)心數(shù)據(jù)的顯示 17411.2.6 第一次嘗試需要專門處理 17511.2.7 不要害怕拋棄自己在DDL中的首次嘗試 17511.2.8 克制使用DML的沖動(dòng) 17611.2.9 不要以方框和箭頭的方式思考 17611.2.10 畫圓和數(shù)據(jù)集示意圖 17711.2.11 學(xué)習(xí)具體的產(chǎn)品 17811.2.12 把WHERE子句看做“超級(jí)變形蟲(chóng)” 17811.2.13 使用新聞組、博客和因特網(wǎng) 17811.3 不要在SQL中使用BIT或BOOLEAN標(biāo)記 17911.3.1 標(biāo)記位于錯(cuò)誤的層 17911.3.2 標(biāo)記使用不當(dāng)使正確屬性難以理解 181第12章 組特征 18412.1 并不是按是否相等來(lái)分組 18512.2 使用組,不看里面是什么 18612.2.1 半面向數(shù)據(jù)集的方式 18712.2.2 分組的解決方案 18812.2.3 解決方案總結(jié) 18912.3 根據(jù)時(shí)間分組 19012.3.1 漸進(jìn)式解決方案 19012.3.2 整體數(shù)據(jù)解決方案 19212.4 其他使用HAVING子句的技術(shù) 19212.5 GROUPING、ROLLUP和CUBE 19412.5.1 GROUPING SET子句 19412.5.2 ROLLUP子句 19512.5.3 CUBE子句 19612.5.4 關(guān)于超級(jí)組的腳注 19612.6 WINDOW子句 19612.6.1 PARTITION BY子句 19712.6.2 ORDER BY子句 19812.6.3 RANGE子句 19812.6.4 編程技巧 199第13章 將技術(shù)規(guī)范變?yōu)榇a 20013.1 不良SQL的標(biāo)志 20013.1.1 代碼的格式是否像另一種語(yǔ)言 20013.1.2 順序訪問(wèn)假設(shè) 20113.1.3 游標(biāo) 20113.1.4 糟糕的內(nèi)聚度 20113.1.5 表值函數(shù) 20213.1.6 同一數(shù)據(jù)元素有多個(gè)名稱 20213.1.7 數(shù)據(jù)庫(kù)中的格式 20213.1.8 將日期保存到字符串中 20313.1.9 BIT標(biāo)記、BOOLEAN及其他計(jì)算列 20313.1.10 跨列的屬性分割 20313.1.11 跨行的屬性分割 20313.1.12 跨表的屬性分割 20313.2 解決方法 20413.2.1 基于游標(biāo)的解決方案 20413.2.2 半面向數(shù)據(jù)集的解決方案 20513.2.3 完全面向數(shù)據(jù)集的解決方案 20713.2.4 面向數(shù)據(jù)集代碼的優(yōu)點(diǎn) 20713.3 解釋含糊的說(shuō)明 20713.3.1 回歸到DDL 20913.3.2 修改問(wèn)題說(shuō)明 211第14章 使用過(guò)程及函數(shù)調(diào)用 21314.1 清除字符串中的空格 21314.1.1 過(guò)程式解決方案#1 21314.1.2 函數(shù)解決方案#1 21414.1.3 函數(shù)解決方案#2 21714.2 聚合函數(shù)PRD() 21814.3 在過(guò)程和函數(shù)中使用長(zhǎng)參數(shù)列表 220第15章 對(duì)行編號(hào) 22315.1 過(guò)程式解決方案 22315.2 OLAP函數(shù) 22615.2.1 簡(jiǎn)單的行編號(hào) 22615.2.2 RANK()和DENSE_RANK() 22715.3 節(jié) 228第16章 保存計(jì)算數(shù)據(jù) 23116.1 過(guò)程式解決方案 23116.2 關(guān)系式解決方案 23216.3 其他種類的計(jì)算數(shù)據(jù) 233第17章 約束類觸發(fā)器 23417.1 計(jì)算類觸發(fā)器 23417.2 通過(guò)CHECK()和CASE約束實(shí)現(xiàn)的復(fù)雜約束 23517.3 通過(guò)視圖實(shí)現(xiàn)復(fù)雜約束 23717.4 用約束實(shí)現(xiàn)視圖操作 23917.4.1 3個(gè)基本操作 23917.4.2 WITH CHECK OPTION子句 24017.4.3 WITH CHECK OPTION與CHECK()子句 24317.4.4 視圖的行為 24417.4.5 聯(lián)合視圖 24617.4.6 簡(jiǎn)單的INSTEAD OF觸發(fā)器 24717.4.7 關(guān)于INSTEAD OF觸發(fā)器的告誡 250第18章 過(guò)程式解決方案和數(shù)據(jù)驅(qū)動(dòng)的解決方案 25118.1 刪除字符串中的字母 25118.1.1 過(guò)程式解決方案 25218.1.2 純粹的SQL解決方案 25218.1.3 不純粹的SQL解決方案 25318.2 數(shù)獨(dú)的兩種求解方法 25418.2.1 過(guò)程式解決方案 25418.2.2 數(shù)據(jù)驅(qū)動(dòng)的解決方法 25418.2.3 處理已知數(shù)字 25518.3 數(shù)據(jù)約束方法 25718.4 裝箱問(wèn)題 26118.4.1 過(guò)程式解決方法 26118.4.2 SQL方式 26218.5 庫(kù)存成本隨時(shí)間的變化 26418.5.1 庫(kù)存中使用的UPDATE語(yǔ)句 26718.5.2 回到裝箱問(wèn)題 268
章節(jié)摘錄
第1章 SQL是聲明式語(yǔ)言,不是過(guò)程式語(yǔ)言 前言里,我談到了一些FORTRAN程序員和一名LISP程序員的事,前者只會(huì)使用循環(huán) 來(lái)解決問(wèn)題,后者只會(huì)使用遞歸方式解決問(wèn)題。這種情況并不少見(jiàn),因?yàn)槿藗兌枷矚g使用自己了解的工具。下面講一個(gè)笑話,不是真事:有人給一個(gè)數(shù)學(xué)家、一個(gè)物理學(xué)家和一個(gè)數(shù)據(jù)庫(kù)程序員各發(fā)了一個(gè)橡皮球,并且讓他們確定球的體積?! ?shù)學(xué)家認(rèn)真地測(cè)量了直徑,然后用球體積公式計(jì)算出了球的體積,或者認(rèn)為這個(gè)球不很圓,就用三重積分計(jì)算了球的體積?! ∥锢韺W(xué)家則在一個(gè)大燒杯中接滿了水,把球放入水中,測(cè)量出排水量。他并不關(guān)心這個(gè)球是什么形狀?! ?shù)據(jù)庫(kù)程序員呢,他到橡皮球生產(chǎn)商的在線數(shù)據(jù)庫(kù)里查了這個(gè)球的型號(hào)和產(chǎn)品序列號(hào),根本不關(guān)心這是不是球。他獲得了這個(gè)球的制造公差、設(shè)計(jì)形狀和尺寸以及其他許多與整個(gè)橡皮球生產(chǎn)過(guò)程有關(guān)的參數(shù)?! ∵@個(gè)故事說(shuō)明:數(shù)學(xué)家知道如何計(jì)算,物理學(xué)家知道如何測(cè)量,而數(shù)據(jù)庫(kù)技術(shù)人員知道如何查找數(shù)據(jù)。每個(gè)人都采用自己的工具來(lái)解決問(wèn)題?! ‖F(xiàn)在我們把問(wèn)題擴(kuò)展到倉(cāng)庫(kù)中成千上萬(wàn)個(gè)橡皮球。數(shù)學(xué)家和物理學(xué)家因此會(huì)花費(fèi)大量的手工勞動(dòng)完成任務(wù),而數(shù)據(jù)庫(kù)技術(shù)員只要下載一些信息,就能夠得出橡皮球的工業(yè)標(biāo)準(zhǔn)(假設(shè)有這種標(biāo)準(zhǔn))以及詳盡得可以用于法庭辯論的文檔?! ?.1 不同的編程模型 自我完善的過(guò)程就是在學(xué)習(xí)新知識(shí)的同時(shí),忘記老的習(xí)慣?! 狤dsgar Dijkstra① 編程模型有多種。過(guò)程式編程語(yǔ)言使用的是由流控制語(yǔ)句(WHILE—D0、IF—THEN—ELSESHBEGIN—END)控制的一系列過(guò)程步驟,借此把輸入數(shù)據(jù)轉(zhuǎn)換成輸出數(shù)據(jù)。這是對(duì)編程的一種傳統(tǒng)認(rèn)識(shí),因?yàn)檫@是著名的數(shù)學(xué)家約翰·馮·諾伊曼歸納出來(lái)的,后來(lái)也常被稱為馮·諾伊曼模型。同樣的源代碼經(jīng)相同的編譯器編譯之后,每次都生成相同的可執(zhí)行模塊。該程序在每次調(diào)用時(shí)都以完全相同的方式工作。這種模型中的關(guān)鍵字是可以預(yù)測(cè)和確定的。由于這種模型具有可確定性,所以主要用于一些數(shù)學(xué)分析?! ×硗?,還有一些變化。一些語(yǔ)言使用了不同的流控制語(yǔ)句。FORTRAN和HCOBOL會(huì)在程序一開(kāi)始就為數(shù)據(jù)分配全部存儲(chǔ)區(qū)。后來(lái)的Algol系列編程語(yǔ)言會(huì)根據(jù)數(shù)據(jù)在程序塊結(jié)構(gòu)中的作用域動(dòng)態(tài)地分配存儲(chǔ)區(qū)?! dsgarDijkstra(參見(jiàn)文獻(xiàn)www.CS.utexas.edu/users/EWD/)發(fā)明了一種非確定性語(yǔ)言。語(yǔ)句,又稱為保護(hù)命令,既可以阻止語(yǔ)句的執(zhí)行,也可以允許該語(yǔ)句的執(zhí)行,而且在打開(kāi)的語(yǔ)句之間沒(méi)有確定的執(zhí)行順序。這種模型沒(méi)有在商業(yè)化產(chǎn)品中實(shí)現(xiàn),但它表明人們?cè)瓉?lái)在編程中認(rèn)為必備的因素(確定性)可以被丟棄?! 『瘮?shù)式編程語(yǔ)言的基礎(chǔ)是用一系列嵌套的函數(shù)調(diào)用來(lái)解決問(wèn)題。在這些語(yǔ)言中,高階函數(shù)可以轉(zhuǎn)換自身的功能,這個(gè)概念非常重要。導(dǎo)數(shù)變換和積分變換就是這種高階函數(shù)在數(shù)學(xué)上應(yīng)用的實(shí)例。這種語(yǔ)言的目標(biāo)之一是避免在程序中出現(xiàn)副作用,保證它們能夠以代數(shù)的方式進(jìn)行優(yōu)化。特別是,一旦某個(gè)表達(dá)式與另一個(gè)表達(dá)式相等(某種意義上的相等),它們就可以替換,而不會(huì)影響整個(gè)運(yùn)算結(jié)果。
媒體關(guān)注與評(píng)論
“Joe Celko寫的所有的書(shū)我都買了,這是其中寫得最好的一本……強(qiáng)烈推薦I” ——Amazon com讀者評(píng)論
編輯推薦
SQL是數(shù)據(jù)庫(kù)的標(biāo)準(zhǔn)數(shù)據(jù)查詢語(yǔ)言,在廣大程序員的日常工作中已必不可少。但是,大部分的SQL程序員都是由過(guò)程式編程人員和面向?qū)ο缶幊倘藛T轉(zhuǎn)變而來(lái)的,他們已經(jīng)習(xí)慣了原有的思維方式,若要充分利用SQL必須學(xué)會(huì)以數(shù)據(jù)集的方式思考?! 禨QL沉思錄》中,世界級(jí)SQL專家、Joe Celko通過(guò)展示實(shí)用技術(shù)及思想方法,教會(huì)大家如何完成這個(gè)轉(zhuǎn)變。書(shū)中通過(guò)大量實(shí)例詳細(xì)介紹了各種SQL編程技術(shù),內(nèi)容涉及查找表、輔助表、虛擬表、時(shí)態(tài)表、視圖、SQL的思考方式等多個(gè)方面,值得所有SQL程序員仔細(xì)研讀和思考?! ∈澜缂?jí)SQL專家經(jīng)典著作 深入揭示SQL編程本質(zhì) 教你不同于過(guò)程和OO編程的全新思考方式
圖書(shū)封面
圖書(shū)標(biāo)簽Tags
無(wú)
評(píng)論、評(píng)分、閱讀與下載
250萬(wàn)本中文圖書(shū)簡(jiǎn)介、評(píng)論、評(píng)分,PDF格式免費(fèi)下載。 第一圖書(shū)網(wǎng) 手機(jī)版