練習(xí) 38:SQL 簡介
譯者:飛龍
協(xié)議:CC BY-NC-SA 4.0
自豪地采用谷歌翻譯
學(xué)習(xí)如何建模和設(shè)計(jì)實(shí)體數(shù)據(jù)的最佳方法唉堪,是從非扯ㄏ酰基本的搭積木開始滓玖。數(shù)據(jù)庫的 SQL(“SeQueL”)風(fēng)格數(shù)十年來已成為數(shù)據(jù)建模和存儲(chǔ)的標(biāo)準(zhǔn)。一旦你知道基本的 SQL帝际,你可以輕松地使用任何 NoSQL 或?qū)ο箨P(guān)系映射(ORM)系統(tǒng)。SQL 是一種非常形式化的存儲(chǔ)溪厘,操作和訪問數(shù)據(jù)的方式胡本,向你提供了一種思考它的形式化方式。這也不是很困難畸悬,因?yàn)檫@個(gè)語言并不像完整的編程語言那樣圖靈完備侧甫。
SQL 無處不在,我不是因?yàn)槲蚁胱屇闶褂盟@么說蹋宦。這只是一個(gè)事實(shí)披粟。我敢打賭,現(xiàn)在你的口袋里有一些 SQL冷冗。所有 Android 手機(jī)和 iPhone 都可以輕松訪問名為 SQLite 的 SQL 數(shù)據(jù)庫守屉,手機(jī)上的許多應(yīng)用程序都可以直接使用它。它撐起了銀行蒿辙,醫(yī)院拇泛,大學(xué),政府思灌,小企業(yè)和大型企業(yè)俺叭;這個(gè)星球上的每個(gè)計(jì)算機(jī),和每一個(gè)人最終都會(huì)接觸一些運(yùn)行 SQL 的東西泰偿。SQL 是一個(gè)非常成功和健壯的技術(shù)熄守。
SQL 的問題是,每個(gè)人似乎都討厭它的本質(zhì)耗跛。大多數(shù)程序員不能忍受裕照,這是一種奇怪的笨拙的“非語言”。在任何現(xiàn)代問題很久之前调塌,比如“網(wǎng)絡(luò)規(guī)慕希”或面向?qū)ο缶幊蹋捅辉O(shè)計(jì)了出來羔砾。盡管基于堅(jiān)實(shí)的數(shù)學(xué)構(gòu)建的操作理論之上搬俊,但是它有令人討厭的足夠的錯(cuò)誤。樹蜒茄?嵌套對(duì)象和父子關(guān)系?SQL只是嘲笑你餐屎,給你一個(gè)大型的扁平的表檀葛,說“你弄清楚它吧,兄弟”腹缩。
如果每個(gè)人都如此討厭它屿聋,為什么要學(xué)習(xí) SQL空扎?因?yàn)檫@個(gè)假設(shè)的仇恨背后,是缺乏對(duì) SQL 的理解以及如何使用它润讥。部分 NoSQL 運(yùn)動(dòng)是對(duì)過時(shí)數(shù)據(jù)庫服務(wù)器的反應(yīng)转锈,也是對(duì) SQL 的恐懼的反應(yīng),它來源于對(duì)其工作原理的忽視楚殿。通過學(xué)習(xí) SQL撮慨,你實(shí)際上將學(xué)習(xí)一些重要理論概念,它們適用于過去和現(xiàn)在幾乎所有數(shù)據(jù)存儲(chǔ)系統(tǒng)脆粥。
無論 SQL 仇恨者聲稱什么砌溺,你應(yīng)該學(xué)習(xí) SQL,因?yàn)樗菬o處不在的变隔,實(shí)際上并不足夠難以學(xué)習(xí)规伐。成為博學(xué)的 SQL 用戶,將幫助你為要使用的數(shù)據(jù)庫做出明智的決定匣缘,無論是否使用 SQL猖闪,并且作為程序員,更深入地了解你使用的許多系統(tǒng)肌厨。
SQL 是什么培慌?
我將 SQL 讀作“Sequal”,但如果你愿意也可以讀作“S-Q-L”夏哭。SQL 也代表結(jié)構(gòu)化查詢語言检柬,但現(xiàn)在還沒有人甚至關(guān)心,因?yàn)槟侵皇且粋€(gè)營銷手段竖配。SQL 所做的事情何址,只是為你提供了一種語言,用于與數(shù)據(jù)庫中的數(shù)據(jù)交互进胯。然而用爪,它的優(yōu)勢(shì)在于,它匹配了許多年前建立的理論胁镐,定義了良好結(jié)構(gòu)化數(shù)據(jù)的屬性偎血。這不完全相同(一些詆毀者感嘆它),但它足夠有用盯漂。
譯者注:不要理會(huì)那些讓你讀成“S-Q-L”的人颇玷,就算標(biāo)準(zhǔn)是這樣,你可以把“Sequal”當(dāng)做別名就缆。
SQL 的工作原理是帖渠,它了解表中的字段,以及如何根據(jù)字段的內(nèi)容在表中查找數(shù)據(jù)竭宰。所有 SQL 操作都是你對(duì)表執(zhí)行的四個(gè)常規(guī)操作之一:
| 名稱 | 中文縮寫 | 首字母 | 意義 |
| --- | --- |
| 創(chuàng)建 | 增 | C | 將數(shù)據(jù)放入表中 |
| 讀取 | 查 | R | 從表中查詢數(shù)據(jù) |
| 更新 | 改 | U | 修改已經(jīng)在表中的數(shù)據(jù) |
| 刪除 | 刪 | D | 從表中移除數(shù)據(jù) |
這縮寫為“CRUD”空郊,被認(rèn)為是每個(gè)數(shù)據(jù)存儲(chǔ)系統(tǒng)必須具備的基本功能份招。事實(shí)上,如果你不能以某種方式來執(zhí)行這四種之一狞甚,那么最好有一個(gè)很好的理由锁摔。
譯者注:一些人把它們簡寫為 CURD 或者 CRUD,其實(shí)都是一樣的哼审。
我喜歡通過將其與 Excel 等電子表格軟件進(jìn)行比較谐腰,來解釋 SQL 的工作原理:
- 數(shù)據(jù)庫是整個(gè)電子表格文件。
- 表格是電子表格中的標(biāo)簽/表格棺蛛,每個(gè)表格都有一個(gè)名稱怔蚌。
- 列就是列。
- 行就是行旁赊。
- 然后桦踊,SQL為你提供了一種語言,用于對(duì)其進(jìn)行 CRUD 操作终畅,來生成新表或更改現(xiàn)有表籍胯。
最后一條是重要的,不了解這個(gè)會(huì)使人們產(chǎn)生問題离福。SQL 只知道表杖狼,每個(gè)操作都生成表。它通過修改現(xiàn)有表來“生成”表妖爷,或者返回一個(gè)新的臨時(shí)表作為數(shù)據(jù)集蝶涩。
在閱讀本書時(shí),你將開始了解此設(shè)計(jì)的意義絮识。例如绿聘,面向?qū)ο笳Z言與 SQL 數(shù)據(jù)庫不匹配的原因之一是,OOP 語言圍繞圖來組織次舌,但 SQL 只希望返回表熄攘。雖然可以將幾乎任何圖形映射到表格,反之亦然彼念,但它為 OOP 語言增加了翻譯負(fù)擔(dān)挪圾。如果 SQL 返回一個(gè)嵌套數(shù)據(jù)結(jié)構(gòu),那么這不會(huì)是一個(gè)問題逐沙。
起步
我們將使用 SQLite3 作為本節(jié)的練習(xí)工具哲思。SQLite3 是一個(gè)完整的數(shù)據(jù)庫系統(tǒng),具有幾乎無需設(shè)置的優(yōu)點(diǎn)吩案。你只需下載一個(gè)二進(jìn)制文件也殖,就像大多數(shù)其他腳本語言一樣使用它。有了它,你將能夠?qū)W習(xí) SQL忆嗜,而不會(huì)卡在數(shù)據(jù)庫服務(wù)器的管理。
安裝 SQLite3 很簡單:
- 請(qǐng)?jiān)L問 SQLite3 下載頁面崎岂,并為你的平臺(tái)獲取二進(jìn)制文件捆毫。尋找“Precompiled Binaries for X”,X 是你的操作系統(tǒng)的首選項(xiàng)冲甘。
- 或使用你的操作系統(tǒng)的軟件包管理器進(jìn)行安裝绩卤。如果你使用 Linux ,那么你知道這是什么意思江醇。如果你使用 macOS 濒憋,那么首先得到一個(gè)包管理器,然后使用它來安裝 SQLite3陶夜。
安裝完成后凛驮,請(qǐng)確保你可以啟動(dòng)命令行并運(yùn)行它。這是一個(gè)快速測試条辟,你可以嘗試:
$ sqlite3 test.db
SQLite version 3.7.8 2011-09-19 14:49:19
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> create table test (id);
sqlite> .quit
然后看到test.db
文件在那里黔夭。如果它可以工作,那么你就完成了羽嫡。你應(yīng)該確保你的 SQLite3 版本與我在這里的版本相同:3.7.8本姥。有時(shí),舊版本的東西不能正常工作杭棵。
學(xué)習(xí) SQL 詞匯
要開始學(xué)習(xí)SQL婚惫,你需要為這些 SQL 術(shù)語創(chuàng)建速記卡(或使用 Anki)。在這之后的練習(xí)中魂爪,你將學(xué)習(xí)這些 SQL 語句先舷,并將其應(yīng)用于不同的問題。思考 SQL 語言的最佳方法是甫窟,將所有東西看做CREATE
密浑,READ
,UPDATE
和DELETE
操作粗井。即使一個(gè)單詞是INSERT
尔破,你仍然會(huì)將其視為CREATE
操作,因?yàn)樗鼘?chuàng)建數(shù)據(jù)浇衬。首先懒构,只要花一些時(shí)間記住這些單詞,并繼續(xù)研究耘擂,就像本節(jié)的練習(xí)一樣胆剧。
CREATE
創(chuàng)建數(shù)據(jù)庫的表格,可以儲(chǔ)存數(shù)據(jù)的列。
INSERT
向數(shù)據(jù)庫表格添加行秩霍,并填充在數(shù)據(jù)的列中篙悯。
UPDATE
修改表中的一列或者多列。
DELETE
從表中刪除一行铃绒。
SELECT
查詢一個(gè)表或一系列表鸽照,返回帶有結(jié)果的臨時(shí)表。
DROP
銷毀一個(gè)表颠悬。
FROM
SQL 語句的常見部分矮燎,用于指定要使用表的那些列。
IN
用于表示元素集合赔癌。
WHERE
用在查詢中诞外,來表示一些東西應(yīng)該來自哪里。
SET
用在更新中灾票,來表示哪一列修改成什么峡谊。
SQL 語法
接下來,你將為 SQL 的另一組重要語法結(jié)構(gòu)創(chuàng)建速記卡铝条。他們不會(huì)太多靖苇,但是寫下它們(或使用 Anki),并開始研究他們班缰,以便你更快地學(xué)習(xí)語言贤壁。你正在學(xué)習(xí)的語法用于 SQLite3,我們將在本書中使用它埠忘。這是一個(gè)相當(dāng)普遍的 SQL 語法脾拆,但每個(gè)數(shù)據(jù)庫都有不同的奇怪的偏好,你必須學(xué)習(xí)它莹妒。一旦了解它名船,很容易弄清楚另外一個(gè)數(shù)據(jù)庫的用法。
你將需要訪問 SQLite 3 定義頁面來創(chuàng)建所需的卡旨怠。該頁面列出了 SQLite 了解的所有內(nèi)容渠驼,但僅關(guān)注上面列出的主要語句。添加你不明白的其他任何單詞鉴腻。他們的圖表有點(diǎn)復(fù)雜迷扇,但它們只是 SQL BNF 的圖形視圖,你在第五部分中了解了它們爽哎。如果你不記得 ABNF蜓席,返回第五部分并重新學(xué)習(xí)。
深入學(xué)習(xí)
- 訪問 SQLite3 語法列表并瀏覽所有可用的命令课锌。他們中的大多數(shù)都不會(huì)有意義厨内,但是如果你有任何興趣,那么你也可以為他們做速記卡。
- 在完成剩余練習(xí)的整個(gè)時(shí)間里雏胃,研究這些速記卡请毛。