# 練習 38:SQL 簡介
> 原文:[Exercise 38: Introduction To SQL](https://learncodethehardway.org/more-python-book/ex38.html)
> 譯者:[飛龍](https://github.com/wizardforcel)
> 協議:[CC BY-NC-SA 4.0](http://creativecommons.org/licenses/by-nc-sa/4.0/)
> 自豪地采用[谷歌翻譯](https://translate.google.cn/)
學習如何建模和設計實體數據的最佳方法,是從非常基本的搭積木開始。數據庫的 SQL(“SeQueL”)風格數十年來已成為數據建模和存儲的標準。一旦你知道基本的 SQL,你可以輕松地使用任何 NoSQL 或對象關系映射(ORM)系統。SQL 是一種非常形式化的存儲,操作和訪問數據的方式,向你提供了一種思考它的形式化方式。這也不是很困難,因為這個語言并不像完整的編程語言那樣圖靈完備。
SQL 無處不在,我不是因為我想讓你使用它而這么說。這只是一個事實。我敢打賭,現在你的口袋里有一些 SQL。所有 Android 手機和 iPhone 都可以輕松訪問名為 SQLite 的 SQL 數據庫,手機上的許多應用程序都可以直接使用它。它撐起了銀行,醫院,大學,政府,小企業和大型企業;這個星球上的每個計算機,和每一個人最終都會接觸一些運行 SQL 的東西。SQL 是一個非常成功和健壯的技術。
SQL 的問題是,每個人似乎都討厭它的本質。大多數程序員不能忍受,這是一種奇怪的笨拙的“非語言”。在任何現代問題很久之前,比如“網絡規模”或面向對象編程,他就被設計了出來。盡管基于堅實的數學構建的操作理論之上,但是它有令人討厭的足夠的錯誤。樹?嵌套對象和父子關系?SQL只是嘲笑你,給你一個大型的扁平的表,說“你弄清楚它吧,兄弟”。
如果每個人都如此討厭它,為什么要學習 SQL?因為這個假設的仇恨背后,是缺乏對 SQL 的理解以及如何使用它。部分 NoSQL 運動是對過時數據庫服務器的反應,也是對 SQL 的恐懼的反應,它來源于對其工作原理的忽視。通過學習 SQL,你實際上將學習一些重要理論概念,它們適用于過去和現在幾乎所有數據存儲系統。
無論 SQL 仇恨者聲稱什么,你應該學習 SQL,因為它是無處不在的,實際上并不足夠難以學習。成為博學的 SQL 用戶,將幫助你為要使用的數據庫做出明智的決定,無論是否使用 SQL,并且作為程序員,更深入地了解你使用的許多系統。
## SQL 是什么?
我將 SQL 讀作“Sequal”,但如果你愿意也可以讀作“S-Q-L”。SQL 也代表結構化查詢語言,但現在還沒有人甚至關心,因為那只是一個營銷手段。SQL 所做的事情,只是為你提供了一種語言,用于與數據庫中的數據交互。然而,它的優勢在于,它匹配了許多年前建立的理論,定義了良好結構化數據的屬性。這不完全相同(一些詆毀者感嘆它),但它足夠有用。
> 譯者注:不要理會那些讓你讀成“S-Q-L”的人,就算標準是這樣,你可以把“Sequal”當做別名。
SQL 的工作原理是,它了解表中的字段,以及如何根據字段的內容在表中查找數據。所有 SQL 操作都是你對表執行的四個常規操作之一:
| 名稱 | 中文縮寫 | 首字母 | 意義 |
| --- | --- | --- | --- |
| 創建 | 增 | C | 將數據放入表中 |
| 讀取 | 查 | R | 從表中查詢數據 |
| 更新 | 改 | U | 修改已經在表中的數據 |
| 刪除 | 刪 | D | 從表中移除數據 |
這縮寫為“CRUD”,被認為是每個數據存儲系統必須具備的基本功能。事實上,如果你不能以某種方式來執行這四種之一,那么最好有一個很好的理由。
> 譯者注:一些人把它們簡寫為 CURD 或者 CRUD,其實都是一樣的。
我喜歡通過將其與 Excel 等電子表格軟件進行比較,來解釋 SQL 的工作原理:
+ 數據庫是整個電子表格文件。
+ 表格是電子表格中的標簽/表格,每個表格都有一個名稱。
+ 列就是列。
+ 行就是行。
+ 然后,SQL為你提供了一種語言,用于對其進行 CRUD 操作,來生成新表或更改現有表。
最后一條是重要的,不了解這個會使人們產生問題。SQL 只知道表,每個操作都生成表。它通過修改現有表來“生成”表,或者返回一個新的臨時表作為數據集。
在閱讀本書時,你將開始了解此設計的意義。例如,面向對象語言與 SQL 數據庫不匹配的原因之一是,OOP 語言圍繞圖來組織,但 SQL 只希望返回表。雖然可以將幾乎任何圖形映射到表格,反之亦然,但它為 OOP 語言增加了翻譯負擔。如果 SQL 返回一個嵌套數據結構,那么這不會是一個問題。
## 起步
我們將使用 SQLite3 作為本節的練習工具。SQLite3 是一個完整的數據庫系統,具有幾乎無需設置的優點。你只需下載一個二進制文件,就像大多數其他腳本語言一樣使用它。有了它,你將能夠學習 SQL,而不會卡在數據庫服務器的管理。
安裝 SQLite3 很簡單:
+ 請訪問 [SQLite3](http://www.sqlite.org/download.html) 下載頁面,并為你的平臺獲取二進制文件。尋找“Precompiled Binaries for X”,X 是你的操作系統的首選項。
+ 或使用你的操作系統的軟件包管理器進行安裝。如果你使用 Linux ,那么你知道這是什么意思。如果你使用 macOS ,那么首先得到一個包管理器,然后使用它來安裝 SQLite3。
安裝完成后,請確保你可以啟動命令行并運行它。這是一個快速測試,你可以嘗試:
```
$ 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`文件在那里。如果它可以工作,那么你就完成了。你應該確保你的 SQLite3 版本與我在這里的版本相同:3.7.8。有時,舊版本的東西不能正常工作。
## 學習 SQL 詞匯
要開始學習SQL,你需要為這些 SQL 術語創建速記卡(或使用 Anki)。在這之后的練習中,你將學習這些 SQL 語句,并將其應用于不同的問題。思考 SQL 語言的最佳方法是,將所有東西看做`CREATE`,`READ`,`UPDATE`和`DELETE`操作。即使一個單詞是`INSERT`,你仍然會將其視為`CREATE`操作,因為它將創建數據。首先,只要花一些時間記住這些單詞,并繼續研究,就像本節的練習一樣。
> `CREATE`
> 創建數據庫的表格,可以儲存數據的列。
> `INSERT`
> 向數據庫表格添加行,并填充在數據的列中。
> `UPDATE`
> 修改表中的一列或者多列。
> `DELETE`
> 從表中刪除一行。
> `SELECT`
> 查詢一個表或一系列表,返回帶有結果的臨時表。
> `DROP`
> 銷毀一個表。
> `FROM`
> SQL 語句的常見部分,用于指定要使用表的那些列。
> `IN`
> 用于表示元素集合。
> `WHERE`
> 用在查詢中,來表示一些東西應該來自哪里。
> `SET`
> 用在更新中,來表示哪一列修改成什么。
## SQL 語法
接下來,你將為 SQL 的另一組重要語法結構創建速記卡。他們不會太多,但是寫下它們(或使用 Anki),并開始研究他們,以便你更快地學習語言。你正在學習的語法用于 SQLite3,我們將在本書中使用它。這是一個相當普遍的 SQL 語法,但每個數據庫都有不同的奇怪的偏好,你必須學習它。一旦了解它,很容易弄清楚另外一個數據庫的用法。
你將需要訪問 [SQLite 3 定義頁面](https://sqlite.org/lang.html)來創建所需的卡。該頁面列出了 SQLite 了解的所有內容,但僅關注上面列出的主要語句。添加你不明白的其他任何單詞。他們的圖表有點復雜,但它們只是 SQL BNF 的圖形視圖,你在第五部分中了解了它們。如果你不記得 ABNF,返回第五部分并重新學習。
## 深入學習
+ 訪問 SQLite3 語法列表并瀏覽所有可用的命令。他們中的大多數都不會有意義,但是如果你有任何興趣,那么你也可以為他們做速記卡。
+ 在完成剩余練習的整個時間里,研究這些速記卡。
- 笨辦法學 Python · 續 中文版
- 引言
- 第一部分:預備知識
- 練習 0:起步
- 練習 1:流程
- 練習 2:創造力
- 練習 3:質量
- 第二部分:簡單的黑魔法
- 練習 4:處理命令行參數
- 練習 5:cat
- 練習 6:find
- 練習 7:grep
- 練習 8:cut
- 練習 9:sed
- 練習 10:sort
- 練習 11:uniq
- 練習 12:復習
- 第三部分:數據結構
- 練習 13:單鏈表
- 練習 14:雙鏈表
- 練習 15:棧和隊列
- 練習 16:冒泡、快速和歸并排序
- 練習 17:字典
- 練習 18:性能測量
- 練習 19:改善性能
- 練習 20:二叉搜索樹
- 練習 21:二分搜索
- 練習 22:后綴數組
- 練習 23:三叉搜索樹
- 練習 24:URL 快速路由
- 第四部分:進階項目
- 練習 25:xargs
- 練習 26:hexdump
- 練習 27:tr
- 練習 28:sh
- 練習 29:diff和patch
- 第五部分:文本解析
- 練習 30:有限狀態機
- 練習 31:正則表達式
- 練習 32:掃描器
- 練習 33:解析器
- 練習 34:分析器
- 練習 35:解釋器
- 練習 36:簡單的計算器
- 練習 37:小型 BASIC
- 第六部分:SQL 和對象關系映射
- 練習 38:SQL 簡介
- 練習 39:SQL 創建
- 練習 40:SQL 讀取
- 練習 41:SQL 更新
- 練習 42:SQL 刪除
- 練習 43:SQL 管理
- 練習 44:使用 Python 的數據庫 API
- 練習 45:創建 ORM
- 第七部分:大作業
- 練習 46:blog
- 練習 47:bc
- 練習 48:ed
- 練習 49:sed
- 練習 50:vi
- 練習 51:lessweb
- 練習 52:moreweb