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