练习 38:SQL 简介

原文:Exercise 38: Introduction To SQL

译者:飞龙

协议:CC BY-NC-SA 4.0

自豪地采用谷歌翻译

学习如何建模和设计实体数据的最佳方法,是从非常基本的搭积木开始。数据库的 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 下载页面,并为你的平台获取二进制文件。寻找“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 语言的最佳方法是,将所有东西看做CREATEREADUPDATEDELETE操作。即使一个单词是INSERT,你仍然会将其视为CREATE操作,因为它将创建数据。首先,只要花一些时间记住这些单词,并继续研究,就像本节的练习一样。

CREATE

创建数据库的表格,可以储存数据的列。

INSERT

向数据库表格添加行,并填充在数据的列中。

UPDATE

修改表中的一列或者多列。

DELETE

从表中删除一行。

SELECT

查询一个表或一系列表,返回带有结果的临时表。

DROP

销毁一个表。

FROM

SQL 语句的常见部分,用于指定要使用表的那些列。

IN

用于表示元素集合。

WHERE

用在查询中,来表示一些东西应该来自哪里。

SET

用在更新中,来表示哪一列修改成什么。

SQL 语法

接下来,你将为 SQL 的另一组重要语法结构创建速记卡。他们不会太多,但是写下它们(或使用 Anki),并开始研究他们,以便你更快地学习语言。你正在学习的语法用于 SQLite3,我们将在本书中使用它。这是一个相当普遍的 SQL 语法,但每个数据库都有不同的奇怪的偏好,你必须学习它。一旦了解它,很容易弄清楚另外一个数据库的用法。

你将需要访问 SQLite 3 定义页面来创建所需的卡。该页面列出了 SQLite 了解的所有内容,但仅关注上面列出的主要语句。添加你不明白的其他任何单词。他们的图表有点复杂,但它们只是 SQL BNF 的图形视图,你在第五部分中了解了它们。如果你不记得 ABNF,返回第五部分并重新学习。

深入学习

  • 访问 SQLite3 语法列表并浏览所有可用的命令。他们中的大多数都不会有意义,但是如果你有任何兴趣,那么你也可以为他们做速记卡。
  • 在完成剩余练习的整个时间里,研究这些速记卡。

书籍推荐