1. 程式人生 > >SQL 進階教程

SQL 進階教程

內容簡介

本書是《SQL 基礎教程》作者 MICK 為志在向中級進階的資料庫工程師編寫的一本 SQL 技能提升指南。

全書可分為兩部分,第一部分介紹了 SQL 語言不同尋常的使用技巧,帶領讀者從 SQL 常見技術,比如 CASE 表示式、自連線、HAVING 子句、外連線、關聯子查詢、EXISTS……去探索新發現。這部分不僅穿插講解了這些技巧背後的邏輯和相關知識,而且輔以豐富的示例程式,旨在幫助讀者提升程式設計水平;第二部分著重介紹關係資料庫的發展史,把實踐與理論結合起來,旨在幫助讀者加深對關係資料庫和 SQL 語言的理解。此外,每節末尾均設定有練習題,並在書末提供瞭解答,方便讀者檢驗自己對書中知識點的掌握程度。

本書適合具有半年以上 SQL 使用經驗、已掌握 SQL 基礎知識和技能、希望提升自己程式設計水平的讀者閱讀。

本書特色

  1. 轉變面向過程語言的思維定式,學習 SQL 常見技術的不同用法,切實提升 SQL 應用技能。
  2. 解析經典文獻,回顧關係資料庫發展史,從邏輯學、集合論的角度講述 SQL 和關係模型的理論,深刻理解面向集合思維。
  3. 講解由淺入深,輔以200多段基於標準 SQL 編寫的示例程式碼和豐富的練習題(包含解答),理論與實踐相結合,易懂、實用、好操作。

作者簡介

MICK,日本知名資料庫工程師,就職於 SI 企業,致力於資料倉庫和商業智慧的開發。日常除了在其個人主頁“關係資料庫的世界”中分享資料庫和 SQL 的相關技術資訊外,還為 CodeZine(http://codezine.jp)及 IT 技術雜誌 WEB+DB PRESS 撰寫相關技術文章。同時還是《SQL 解惑(第2版)》日文版的譯者。

本書內容

譯者序

我曾在日本從事多年軟體開發工作,工作中經常會跟各種資料庫打交道,編寫 SQL 程式碼也是常有的事情。但是對於 SQL 語言,當時也只是通過大學裡的一門講授資料庫系統的課程瞭解了基本的語法,在工作中積累了一些實用的經驗而已,並沒有進行過非常深入的研究。於是我便打算找一本深入一些的書,最好是面向有一定程式設計經驗的讀者的,系統地學習一下。

後來我在書店遇見了 MICK 先生的這本書,翻看前言,嘗試了他提出的檢驗讀者水平的若干問題。非常遺憾,我只能回答出很少的幾個,於是我便認為這本書正是我需要的,當場決定買下了。

幾年過去,我由於個人原因回國了,工作中也不再使用日語,便想著藉著業餘時間翻譯一些優秀的日語技術書。當圖靈公司的老師問我是否有意向翻譯這本書時,我立刻就答應了。當初回國時為了縮減行李,我只保留了幾本日語原版的技術書,這本就是其中之一。這樣一本多年前結緣、至今仍躺在我書架上的好書,當有機會將它翻譯成中文版時,我實在沒有什麼理由放棄掉。

這本書,我認為是作者的用心之作。書中大部分內容都來自作者記錄自己實踐總結和日常思考的個人部落格,最大的特點是理論與實踐相結合,除了講述應該怎麼做,還解釋了其背後的原理。全書包含兩部分內容,第一部分介紹了 SQL 在使用方面的一些技巧,第二部分介紹了關係資料庫相關的內容。第一部分在介紹 SQL 的技巧時,作者並沒有上來就展示各種酷炫的招式,而是先以簡單的問題或者例題引出將要討論的內容,在講解之後進一步擴充套件,由點及面地引出更深的話題或者背後的原理。這種由淺入深的講述方式,符合一般的學習習慣,讀者能在輕鬆愉悅的閱讀過程中,跟著作者一起思考,自然而然地掌握相應的思考方式。第二部分在介紹關係資料庫時,作者先介紹了關係資料庫誕生的歷史背景及其解決的問題。關係資料庫已經誕生了幾十年,為了讓現在的讀者理解當初的問題和背景,作者大量引用了關係資料庫之父 E.F. Codd 和關係資料庫領域權威專家 C.J. Date 的文獻和言論,並按自己的理解給出了分析與解釋,力圖使讀者體會到偉大人物們在革新技術之際的心路歷程。除此之外,第二部分中作者還從邏輯學和集合論的角度講述了 SQL 和關係模型的理論基礎。該部分內容作者充分發揮了自己在相關領域的深厚積累,以深入淺出的方式進行了闡述,我認為非常精彩。

書中引用了許多經典的圖書和文獻,都在腳註和書末參考文獻中給出了詳細的出處,方便有需要的讀者進一步研讀。更加可貴的是,在大多數小節的末尾作者都提出了兩三個精心設計的小問題,這些問題是正文內容的擴充套件和延伸,非常利於讀者鞏固相應的知識點。而且,針對這些問題,作者也給出了詳細的解答,並指出了讀者容易犯的錯誤。

本書推薦資料庫工程師、經常需要和資料庫打交道的軟體工程師,以及所有希望提升 SQL 水平的讀者閱讀。在翻譯過程中,我盡力表達出原著的意圖,但是由於水平有限,難免存在問題,歡迎讀者批評指正。讀者在閱讀中有任何問題,都可以通過電子郵件和我取得聯絡([email protected])。

2017 年 9 月

於北京

前言

編寫本書的目的在於架起兩座橋樑:一是讓資料庫工程師從初級向中級進階的橋樑,旨在幫助初級工程師提升自己;二是理論(原理)和實踐之間的橋樑。這裡所說的“初級”,具體是指已經掌握了 SQL 的基礎知識和技能,具有半年到一年左右的使用經驗這種水平。

我們來做一個測試,幫助大家瞭解一下自己處於何種水平。下面有10個問題,請回答 Yes 或 No。

  1. 沒有在聚合函式中使用過 CASE 表示式。

  2. 想象不出自連線是如何工作的。

  3. 感覺 HAVING 子句不是很常用。

  4. 感覺 INEXISTS 好用,所以更喜歡用 IN

  5. 聽到布林型別,腦海裡浮現出的只有 truefalse

  6. 設計表的時候不加 NOT NULL 的約束。

  7. SQL 全部用大寫字母或全部用小寫字母來寫。

  8. 不能用一句話說出 GROUP BYPARTITION BY 的區別。

  9. 不知道 SQL 裡的高階函式的名字。

  10. 試著讀過 Joe Celko 的《SQL 權威指南》[1]和《SQL 解惑(第2版)》[2],但是感覺太難而沒能讀完(或者壓根兒沒有讀過)。

大家的回答如何呢?如果全部都回答了 No,那很好,不要擔心什麼,請合上本書,立刻踏上成為一名高階工程師的道路吧(也許只有本書3-2節“參考文獻”值得略讀一下)。相反,如果一半以上都回答了 Yes,那麼本書將照亮大家的前進之路——這正是編寫本書的目的,相信大家讀後一定會有收穫。

但是,接下來要說的內容可能會讓大家覺得有點前後矛盾。因為,這本書即將介紹的技術絕不是多麼新潮的東西,而是遵循標準 SQL 的非常普通的技術。關於這一點,相信掃一眼目錄你就會明白。CASE 表示式、自連線、HAVING 子句、外連線、關聯子查詢、EXISTS……這些都是資料庫工程師日常工作中經常用到的技術。

編寫本書的目的就是從新的角度把光照向這些“並沒有什麼特別的、誰都知道的技術”,照亮它們迄今都沒有被看到的一面。相信大家讀完本書時,會從那個一直以來都被認為平淡無奇的關係資料庫的世界裡,看到一些不一樣的光輝。

下面,就讓我們立刻前往博大精深的關係資料庫的世界,開始探險之旅吧。

宣告

本書中的 URL 等資訊可能會有變化。

本書出版之際,我們力求準確闡述,但是翔泳社、原書作者、人民郵電出版社和譯者均不對內容作任何保證,對於由本書內容和示例程式碼造成的一切後果,不承擔任何責任。

本書中的示例程式碼和指令碼,以及執行結果頁面都是基於特定環境的參考示例。

本書中的公司名、商品名分別是相關公司的商標或註冊商標。


[1] 原書名為 Joe Celko's SQL for Smarties: Advanced SQL Programming,本書共有五版。國內引進了第4版,書名為《SQL 權威指南(第4版)》,朱巍等譯,人民郵電出版社,2013年。——編者注

[2] 米全喜譯,人民郵電出版社,2008年4月。——編者注

閱讀本書時的注意事項
  • 本書中出現的 SQL 語句都是儘可能按照標準 SQL(SQL-92/99/2003)來寫的,對於依賴具體資料庫實現的地方,本書會有明確的說明。

  • 按照標準 SQL 的要求,指定表的別名的關鍵字 AS 也應該寫上,但本書省略了。這是為了避免 SQL 程式在 Oracle 資料庫中出錯(其他資料庫裡也一樣,省略了就不會出錯)。

  • RANKROW_NUMBER 這樣的視窗函式(OLAP 函式)目前還不能在 MySQL 資料庫中執行。

  • 正文裡的程式碼在以下資料庫中測試執行過。

    • Oracle 10g
    • SQL Server 2005
    • DB2 9.1
    • PostgreSQL 9.6
    • MySQL 5.0
  • 正文裡提到 Oracle、MySQL 等資料庫而未指定版本時,請參照上述版本。

  • 關於用於建立示例用表的 SQL 語句和示例程式碼等,請參考如下網站。

    http://www.ituring.com.cn/book/1813(請點選“隨書下載”下載中文版相關資料)

    http://www.geocities.jp/mickindex/database/db_support_sinan.html(作者 MICK 的日文網站)

1-1 CASE 表示式
1-2 自連線的用法
1-3 三值邏輯和 NULL
1-4 HAVING 子句的力量
1-5 外連線的用法
1-6 用關聯子查詢比較行與行
1-7 用 SQL 進行集合運算
1-8 EXISTS 謂詞的用法
1-9 用 SQL 處理數列
1-10 HAVING 子句又回來了
1-11 讓 SQL 飛起來
1-12 SQL 程式設計方法
2-1 關係資料庫的歷史
2-2 為什麼叫“關係”模型
2-3 開始於關係,結束於關係
2-4 地址這一巨大的怪物
2-5 GROUP BY 和 PARTITION BY
2-6 從面向過程思維向宣告式思維、面向集合思維轉變的7個關鍵點
2-7 SQL 和遞迴集合
2-8 人類的邏輯學
2-9 消滅 NULL 委員會
2-10 SQL 中的層級
3-1 習題解答
3-2 參考文獻
後記

閱讀全文: http://gitbook.cn/gitchat/geekbook/5c04b2d4b4075a37edf1522a