笨辦法學(xué) Python · 續(xù) 練習(xí) 38:SQL 簡介

練習(xí) 38:SQL 簡介

原文:Exercise 38: Introduction To 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密浑,READUPDATEDELETE操作粗井。即使一個(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í)間里雏胃,研究這些速記卡请毛。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市瞭亮,隨后出現(xiàn)的幾起案子获印,更是在濱河造成了極大的恐慌,老刑警劉巖街州,帶你破解...
    沈念sama閱讀 211,348評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異玻孟,居然都是意外死亡唆缴,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門黍翎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來面徽,“玉大人,你說我怎么就攤上這事匣掸√宋桑” “怎么了?”我有些...
    開封第一講書人閱讀 156,936評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵碰酝,是天一觀的道長霎匈。 經(jīng)常有香客問我,道長送爸,這世上最難降的妖魔是什么铛嘱? 我笑而不...
    開封第一講書人閱讀 56,427評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮袭厂,結(jié)果婚禮上墨吓,老公的妹妹穿的比我還像新娘。我一直安慰自己纹磺,他們只是感情好帖烘,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,467評(píng)論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著橄杨,像睡著了一般秘症。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上讥珍,一...
    開封第一講書人閱讀 49,785評(píng)論 1 290
  • 那天历极,我揣著相機(jī)與錄音,去河邊找鬼衷佃。 笑死趟卸,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播锄列,決...
    沈念sama閱讀 38,931評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼图云,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了邻邮?” 一聲冷哼從身側(cè)響起竣况,我...
    開封第一講書人閱讀 37,696評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎筒严,沒想到半個(gè)月后丹泉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,141評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鸭蛙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,483評(píng)論 2 327
  • 正文 我和宋清朗相戀三年摹恨,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片娶视。...
    茶點(diǎn)故事閱讀 38,625評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡晒哄,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出肪获,到底是詐尸還是另有隱情寝凌,我是刑警寧澤,帶...
    沈念sama閱讀 34,291評(píng)論 4 329
  • 正文 年R本政府宣布孝赫,位于F島的核電站较木,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏寒锚。R本人自食惡果不足惜劫映,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,892評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望刹前。 院中可真熱鬧泳赋,春花似錦、人聲如沸喇喉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拣技。三九已至千诬,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間膏斤,已是汗流浹背徐绑。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留莫辨,地道東北人傲茄。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓毅访,卻偏偏與公主長得像,于是被迫代替她去往敵國和親盘榨。 傳聞我的和親對(duì)象是個(gè)殘疾皇子喻粹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,492評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容