ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# 练习 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 语法列表并浏览所有可用的命令。他们中的大多数都不会有意义,但是如果你有任何兴趣,那么你也可以为他们做速记卡。 + 在完成剩余练习的整个时间里,研究这些速记卡。