# 练习 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