跳至主要内容

SQLite 初学者指南

通过命令行界面学习 SQLite 数据库基础知识:从 SQLite 点命令到其实际应用示例。
· 10分钟 阅读

使用 AI 探索

什么是 SQLite?

如果您熟悉关系型数据库系统,很可能听过 MySQL、SQL Server 或 PostgreSQL 等“重量级”产品。然而,SQLite 是另一款实用的 RDBMS,易于搭建和使用,并且相较其他关系型数据库具有许多独特特性。这些特性包括:

  • 无需服务器:也就是说,无需启动、停止或配置任何服务器进程。也不需要数据库管理员来分配实例或管理用户访问权限。
  • 简单的数据库文件:一个 SQLite 数据库就是一个普通的单个磁盘文件,可以存放在任意目录中。这也使共享变得简单,因为数据库文件可以轻松复制到 U 盘或通过电子邮件发送。
  • 显式类型(Manifest Typing):大多数 SQL 数据库引擎依赖静态类型,也就是某一列只能存储与其类型相同的数据。然而,SQLite 使用显式类型,这允许将任意类型、任意大小的数据存入任意列,而不受该列声明类型的限制。请注意,此规则有一些例外,例如整数主键列只能存储整数。

当然,如同大多数事物一样,SQLite 相较其他数据库引擎也有一些局限。例如,SQLite 不支持 右外连接或全外连接,而无服务器的特性在安全性和防止数据滥用方面有时也可能是个劣势。尽管如此,它在特定场景下依然非常强大且实用。举例来说,我在最近一个社交媒体分析的工作项目中,就使用 SQLite 数据库存储了数百万 Twitter 用户的 $edge \space list^{1}$,方式既简单又高效。

因此,在本初学者教程中,我将演示如何使用 SQLite 数据库。我们将依次介绍 SQLite 的安装与设置、表的创建与操作、SQLite 点命令,以及如何使用简单的 SQL 查询来处理 SQLite 数据库中的数据。

$^{1}$ 边列表(edge list)或邻接表是网络分析中用于表示图的一组无序列表。每个列表描述图中某个节点(或顶点)的邻居集合。

如何安装与设置 SQLite

首先我们来看看如何在您的电脑上安装 SQLite。这非常简单。参考 Sayak Paul 的《Python 使用 SQLite 教程》,您会发现有一个名为 DB Browser for SQLite 的图形化工具,可以让您轻松上手。不过,为了多样性起见,我将展示如何使用命令行工具——这也是我有时更偏好的方式。

如果您使用的是 Windows 设备,首先需要访问以下网站并下载 sqlite-tools-win32-x86-3270200.zip。解压后,您应能看到如下三个文件:

sqlite files

之后,启动 SQLite 命令行就像双击 sqlite3 应用程序一样简单,命令行窗口会像这样弹出:

sqlite3 pop up

您可能会注意到,SQLite 的默认行为是使用临时的内存数据库。大多数情况下,您并不希望这样。相反,我们将使用点命令 .open 加上您想给新数据库文件起的名字来创建一个新数据库(见下图):

sqlite3 new database

就这样,您已经创建了一个新数据库。另请注意,务必要在所需的数据库名称后加上 .db 扩展名以创建数据库文件。我们将数据库命名为 Tweet_Data.db,因为我会用推文来填充数据库中的表。

创建表

数据库创建好之后,我们就可以着手创建推文表了。有两种方式可用。第一种是直接导入 .csv 文件并将其作为一张表。这需要先使用 .mode 点命令设置为 csv 模式,然后使用 .import 点命令,传入文件(本例为与程序同一文件夹下的 csv,但如果输入完整路径,电脑上任意 csv 均可)以及您自定义的表名。您可能还想用 .headers 点命令加上 on 来显示列表头。(见下图)

sqlite3 import csv

完成后,您可以使用 .tables 命令来显示数据库文件中所有可用的表,并使用 .schema 命令加表名来显示该表的结构。此外,您还可以执行一个简单的查询,如 SELECT $$ FROM Table_Name*,以验证数据是否已导入。

displayed table structure sqlite3

除了通过导入 csv 等文件创建表之外,您还可以使用 CREATE TABLE 创建表,然后用 INSERT INTO 插入新行。以下示例展示了如何从零创建一张表并插入两行数据。

注意:在 SQLite 命令行中,如果您想像示例那样在下一行继续书写同一个查询,只需在想换行时按 Enter。当语句末尾出现分号后,再按 Enter,查询才会被执行。

create table sqlite3

从 SQLite 导出

如果您想把查询结果导出到外部文件(如 csv),SQLite 也能轻松做到。为了干净地导出到 csv,流程与导入类似。首先使用 .header 加 on 以及 .mode 加 csv。随后,使用 .output 点命令并指定目标 csv 文件名,最后执行您想导出的 SQL 查询,并用 .exit 命令退出 SQLite。我们来把上一步创建的新表导出为 csv。

sqlite3 output

下面就是包含 Sample_Tweets_2 数据的新 csv 文件。

new csv

更新表

除了创建和导出表之外,您还可以使用 UPDATE/SET 和 DROP TABLE 等 SQL 语句来更新表中的行或直接删除整张表。下面的示例中,我们将更新示例表 Sample_Tweets_2 中的第二条推文。

update/set and drop table

现在让我们与示例表 Sample_Tweets_2 告别,使用 DROP TABLE 将其从数据库文件中删除:

drop table

使用 SQLite 数据库处理 Twitter 数据

至此,您基本已经了解了如何操作 SQLite 数据库并处理表,接下来要做的就是通过 SQL 查询提取有用信息。这里我将展示在我的 Twitter 社交媒体分析项目中使用过的两三个相对简单的查询。您可以把它看作一个小型案例研究,展示 SQLite 数据库在真实场景中的应用。

先从简单的开始:在 Sample_Tweets 表中查找所有唯一的 Twitter 用户屏幕名。在我使用这些推文的项目中,找到我所收集推文的所有唯一用户至关重要,因为我需要获取他们的关注者,以创建本教程开头提到的边列表。

unique users in database

数据库中共有 26,860 位唯一用户。鉴于我当时关注的话题是网站本地化和翻译,这是一个非常不错的样本。我们再用稍微复杂一些的 SQL 查询来看看样本中发推最多的前 20 位用户(不含转推):

top 20 users

您瞧,发推最多的竟然是个机器人!不过,名单中的最后一位 UweMuegge,根据我为该项目计算的多种网络统计指标,确实颇具影响力。然而,他绝对不是最重要的那个。

最后,我们再用一个 SQL 查询来看看 UweMuegge 发过的一些推文:

uwemuegge tweets

看起来主要有两个主题:翻译招聘信息和翻译会议。这也能解释为何业内人士会在 Twitter 上关注他。

上面截图中还有一点很明显:这也暴露了 SQLite 命令行界面的一个限制。如果文本字段很长,它们的显示效果不佳,也不易阅读。这种情况下,使用 DB Browser for SQLite 是个好主意。

总结

在本教程中,您学习了如何创建 SQLite 数据库,并使用点命令和 SQL 语句来操作表。此外,您还看到一个小型的真实案例,我如何用 SQLite 数据库来处理 Twitter 数据。这已经学了不少内容,恭喜您!

值得一提的是,将 SQLite 数据库与 R 和 Python 结合使用最为高效。您可以通过 Python 的 sqlite3 模块来操作 SQLite 数据库(若想了解更多,请参阅 用 Python 操作 SQLite 教程),也可以通过 R 与 RSQLite 来实现。事实上,我之前提到的 Twitter 用户关注者的边列表,就存放在我使用 RSQLite 创建的 SQLite 数据库中,我将每位用户的关注者网络逐一追加到一张表里。在项目的这一步中使用 SQLite 至关重要,因为像停电或 Windows 自动更新之类的情况可能会强制关机,让您不得不从头开始收集关注者网络。受 Twitter API 速率限制影响,这可能需要大约 4 周时间,所以一旦发生这种情况,从 0 开始是非常不理想的。然而,如果您在收集过程中将关注者网络持续保存到 SQLite 数据库中,即使电脑被强制关机,您也可以从数据库中最后一位用户的下一位继续收集,极大节省时间。

这只是 SQLite 数据库如何成为数据科学家利器的一个例子。我鼓励您在本教程之外,继续深入研究 SQLite 数据库和 SQL。保持学习,前路无垠!

如果您想进一步学习 SQL,请参加 DataCamp 的 关系型数据库 SQL 入门 课程。

主题