SQLite 入门教程:零基础快速上手指南
前言:为什么选择 SQLite?
在数据库的广阔世界里,有像 Oracle、MySQL、PostgreSQL 这样强大而复杂的“巨型航母”,它们功能全面,性能卓越,是大型企业级应用的中流砥柱。但对于许多场景,比如桌面应用、移动 App、小型网站、数据分析原型、甚至是物联网设备,动用这些“航母”无异于“杀鸡用牛刀”。
这时,一个轻量、高效、易用的数据库解决方案就显得尤为重要。SQLite 正是为此而生。
SQLite 是什么?
它是一个 C 语言库,实现了一个小型的、快速的、自给自足的、高可靠性的、功能完备的 SQL 数据库引擎。与大多数其他 SQL 数据库不同,SQLite 不是一个客户端/服务器模型的数据库引擎。相反,它直接被嵌入到最终的程序中。
SQLite 的核心优势:
- 零配置(Serverless):没有独立的服务器进程需要安装、配置和管理。你不需要担心端口、用户权限、启动服务等繁琐事务。
- 单个文件:整个数据库(包括定义、表、索引和数据)都存储在宿主主机上的一个单一文件中。这使得数据库的复制、移动、备份和共享变得像复制一个普通文件一样简单。
- 跨平台:无论你是在 Windows, macOS, Linux, Android 还是 iOS 上,SQLite 都能完美运行。
- 公共领域:代码完全开放,你可以自由地用于任何商业或私人目的,无需支付任何费用。
- 小巧玲珑:其核心库非常小,非常适合资源受限的环境。
本教程旨在为完全没有数据库经验的初学者提供一份清晰、详尽的路线图。我们将从零开始,一步步带你走进 SQLite 的世界,让你不仅学会如何使用它,更能理解其背后的基本原理。
第一部分:准备工作 – 安装与初体验
在开始编码之前,我们需要先在我们的电脑上准备好 SQLite 环境。
1. 安装 SQLite
Windows 用户:
- 访问 SQLite 官方下载页面:https://www.sqlite.org/download.html
- 在 “Precompiled Binaries for Windows” 部分,下载
sqlite-tools-win32-*.zip
(根据你的系统选择 32 位或 64 位)。这个压缩包里包含了我们将要使用的命令行工具sqlite3.exe
。 - 解压下载的文件,你会得到一个名为
sqlite3.exe
的可执行文件。 - 为了方便在任何目录下都能使用它,建议将其所在的文件夹路径添加到系统的环境变量 (PATH) 中。
- (简易方法)或者,你可以直接将
sqlite3.exe
复制到C:\Windows\System32
目录下。 - (推荐方法)创建一个你喜欢的文件夹(如
D:\Tools\sqlite
),将sqlite3.exe
放入其中,然后将这个文件夹路径添加到系统环境变量Path
中。
- (简易方法)或者,你可以直接将
macOS 和 Linux 用户:
好消息!macOS 和大多数 Linux 发行版(如 Ubuntu, CentOS)通常都预装了 SQLite。你可以打开终端(Terminal)来验证一下。
输入以下命令并回车:
bash
sqlite3 --version
如果你看到类似于 3.37.2 2022-01-06...
这样的版本号信息,那么恭喜你,可以跳过安装步骤。
如果提示命令未找到,你可以通过包管理器轻松安装:
- macOS (使用 Homebrew):
brew install sqlite
- Debian/Ubuntu:
sudo apt-get update && sudo apt-get install sqlite3
- CentOS/Fedora:
sudo yum install sqlite
或sudo dnf install sqlite
2. 第一次亲密接触:创建你的第一个数据库
安装完成后,让我们来创建并进入一个数据库。操作非常简单。
打开你的命令行工具(Windows 的 cmd
或 PowerShell
,macOS/Linux 的 Terminal
),进入一个你希望存放数据库文件的目录(例如,你的桌面或一个专门的项目文件夹)。
然后输入以下命令:
bash
sqlite3 school.db
这个命令的意思是:
* 如果当前目录下存在一个名为 school.db
的文件,则打开这个数据库。
* 如果不存在,则创建一个新的、空的数据库文件 school.db
,然后打开它。
执行后,你会看到类似这样的界面:
SQLite version 3.37.2 2022-01-06 14:52:19
Enter ".help" for usage hints.
sqlite>
sqlite>
这个提示符告诉你,你已经成功进入了 SQLite 的交互式命令行环境。现在,你可以在这里输入 SQL 命令来操作 school.db
这个数据库了。
第二部分:核心概念 – 数据库的基石
在动手操作之前,我们必须理解几个最基本的概念。
- 数据库 (Database):可以把它想象成一个大仓库或一个 Excel 工作簿文件(比如我们刚创建的
school.db
)。它是所有数据的容器。 - 表 (Table):是数据库中存储数据的基本单位。可以把它想象成 Excel 工作簿里的一张张工作表(Sheet)。例如,在一个
school
数据库中,我们可以有students
表、teachers
表、courses
表等。 - 列 (Column/Field):表是由列组成的,每一列定义了某种特定类型的数据。就像 Excel 表格的表头(A列、B列……),比如
students
表可以有id
列、name
列、age
列。 - 行 (Row/Record):表中的每一行代表一个具体的数据实体。就像 Excel 表格里的一行数据。例如,
students
表中的一行就代表一个具体的学生信息。 - 数据类型 (Data Type):定义了列中可以存储什么样的数据。SQLite 的数据类型非常灵活,但最核心的有五种:
INTEGER
:整数。例如1
,100
,-50
。REAL
:浮点数(小数)。例如3.14
,98.6
。TEXT
:文本字符串。例如'张三'
,'Hello, World!'
。BLOB
:二进制大对象 (Binary Large Object)。用于存储任何二进制数据,比如图片、音频文件等。NULL
:表示一个空值或未知值。
第三部分:实战演练 – SQL 增删改查 (CRUD)
SQL (Structured Query Language) 是我们与数据库沟通的语言。我们将学习最核心的四种操作,通常被称为 CRUD:Create (创建), Read (读取), Update (更新), Delete (删除)。
我们将围绕一个 students
表来进行所有操作。
1. 创建 (Create) – CREATE
& INSERT
A. 创建表 (CREATE TABLE
)
首先,我们需要在 school.db
里创建一张 students
表,用来存放学生信息。
在 sqlite>
提示符后,输入以下命令并回车:
sql
CREATE TABLE students (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
age INTEGER,
major TEXT,
enroll_date TEXT DEFAULT (date('now'))
);
让我们逐行解析这个命令:
CREATE TABLE students (...)
:这是固定语法,表示我们要创建一张名为students
的表。id INTEGER PRIMARY KEY AUTOINCREMENT
:id INTEGER
:定义一个名为id
的列,类型为整数。PRIMARY KEY
(主键):这是最重要的约束!它告诉 SQLite,id
列是每一行数据的唯一标识符,其值必须唯一且不能为NULL
。就像每个人的身份证号一样。AUTOINCREMENT
:告诉 SQLite,当我们插入新数据时,如果没提供id
值,它会自动为我们生成一个递增的整数(1, 2, 3…)。
name TEXT NOT NULL
:name TEXT
:定义一个名为name
的列,类型为文本。NOT NULL
(非空约束):表示name
列在插入数据时必须有值,不能为空。
age INTEGER
:定义一个名为age
的列,类型为整数。这里我们允许它为空。major TEXT
:定义一个名为major
的列,类型为文本。enroll_date TEXT DEFAULT (date('now'))
:enroll_date TEXT
:定义一个入学日期列。DEFAULT (date('now'))
(默认值约束):如果在插入数据时没有指定这个值,SQLite 会自动使用当前日期作为默认值。
命令执行成功后,SQLite 不会返回任何信息,只是显示一个新的 sqlite>
提示符。
B. 插入数据 (INSERT INTO
)
表结构已经建好,现在我们向 students
表里添加一些学生记录。
插入单条记录:
sql
INSERT INTO students (name, age, major) VALUES ('张三', 20, '计算机科学');
INSERT INTO students (...)
:指定要向students
表插入数据。括号里列出了我们要为哪些列提供值。VALUES (...)
:提供了与前面列名一一对应的值。注意,文本值需要用单引号' '
括起来。- 我们没有提供
id
和enroll_date
,因为id
会自动增长,enroll_date
会使用默认值。
插入另一条记录:
sql
INSERT INTO students (name, age, major) VALUES ('李四', 22, '物理学');
插入一条信息不全的记录:
sql
INSERT INTO students (name, major) VALUES ('王五', '历史学');
这里我们没有提供 age
,因为 age
列允许为 NULL
。
2. 读取 (Read) – SELECT
SELECT
是我们用得最多的命令,它用于从表中检索数据。
A. 查询所有数据
要查看 students
表里的所有行和所有列,使用星号 *
作为通配符。
sql
SELECT * FROM students;
你可能会看到这样的输出:
1|张三|20|计算机科学|2023-10-27
2|李四|22|物理学|2023-10-27
3|王五||历史学|2023-10-27
(王五
的年龄处是空的,因为我们插入时未提供)
B. 查询指定列
如果我们只关心学生的姓名和专业,可以这样做:
sql
SELECT name, major FROM students;
输出:
张三|计算机科学
李四|物理学
王五|历史学
C. 条件查询 (WHERE
)
WHERE
子句用于筛选出满足特定条件的记录。
查询年龄大于 20 岁的学生:
sql
SELECT * FROM students WHERE age > 20;
输出:
2|李四|22|物理学|2023-10-27
查询专业是“计算机科学”的学生:
sql
SELECT name, age FROM students WHERE major = '计算机科学';
输出:
张三|20
使用 AND
和 OR
进行多条件查询:
查询年龄大于 20 且 专业是“物理学”的学生。
sql
SELECT * FROM students WHERE age > 20 AND major = '物理学';
查询年龄大于 21 或 专业是“历史学”的学生。
sql
SELECT * FROM students WHERE age > 21 OR major = '历史学';
模糊查询 (LIKE
)
LIKE
操作符用于在文本数据中进行模式匹配。
* %
:匹配任意多个(包括零个)字符。
* _
:匹配任意单个字符。
查询所有姓“张”的学生:
sql
SELECT * FROM students WHERE name LIKE '张%';
D. 排序 (ORDER BY
)
使用 ORDER BY
对结果进行排序。
按年龄升序排序(默认):
sql
SELECT * FROM students ORDER BY age;
或明确指定 ASC
(Ascending):
sql
SELECT * FROM students ORDER BY age ASC;
按年龄降序排序:
使用 DESC
(Descending)。
sql
SELECT * FROM students ORDER BY age DESC;
E. 限制数量 (LIMIT
)
LIMIT
用于限制返回的记录数量,常用于分页。
只查询前 2 条记录:
sql
SELECT * FROM students LIMIT 2;
3. 更新 (Update) – UPDATE
UPDATE
命令用于修改表中已存在的记录。
极其重要: 使用 UPDATE
时,几乎总是需要带上 WHERE
子句!否则,你将会更新表中的所有行!
假设我们发现“王五”的年龄信息错了,他其实是 21 岁。我们可以根据他的 id
或 name
来更新。
sql
UPDATE students SET age = 21 WHERE name = '王五';
这条命令的意思是:在 students
表中,将 age
列的值更新为 21
,但只对 name
是 '王五'
的那一行生效。
现在我们再查询一次:
sql
SELECT * FROM students WHERE name = '王五';
输出:
3|王五|21|历史学|2023-10-27
年龄已经被成功更新。
4. 删除 (Delete) – DELETE
DELETE
命令用于从表中删除记录。
同样极其重要: 使用 DELETE
时,务必带上 WHERE
子句!否则,你将会删除表中的所有数据!
假设学生“李四”毕业了,我们需要将他的记录从表中删除。
sql
DELETE FROM students WHERE id = 2;
或者
sql
DELETE FROM students WHERE name = '李四';
执行后,我们再查询所有学生:
sql
SELECT * FROM students;
输出:
1|张三|20|计算机科学|2023-10-27
3|王五|21|历史学|2023-10-27
“李四”的记录已经消失了。
第四部分:表结构管理
除了操作数据,我们有时也需要修改表本身的结构。
1. 修改表 (ALTER TABLE
)
SQLite 的 ALTER TABLE
功能有限,但支持两个最常用的操作。
A. 重命名表
将 students
表改名为 alumni
。
sql
ALTER TABLE students RENAME TO alumni;
B. 添加新列
为 alumni
表添加一个 gender
(性别) 列。
sql
ALTER TABLE alumni ADD COLUMN gender TEXT;
现在 alumni
表的每一行都会多出一个 gender
列,其值为 NULL
。
2. 删除表 (DROP TABLE
)
如果你确定不再需要某张表,可以用 DROP TABLE
将其连同所有数据一起永久删除。此操作不可逆,请谨慎使用!
sql
DROP TABLE alumni;
执行后,alumni
表将不复存在。
第五部分:实用的 SQLite 点命令
在 sqlite>
交互环境中,有一些以点 .
开头的特殊命令,它们不是 SQL 语句,而是 SQLite 命令行工具提供的辅助功能,非常有用。
.help
:显示所有点命令的帮助信息。.databases
:列出当前连接的数据库文件。.tables
:列出当前数据库中的所有表。.schema [table_name]
:显示指定表的CREATE TABLE
语句。如果不指定表名,则显示所有表的。这个命令对于查看表结构非常方便。
sql
sqlite> .schema students
CREATE TABLE students (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
age INTEGER,
major TEXT,
enroll_date TEXT DEFAULT (date('now'))
);.headers on
:在SELECT
查询结果的顶部显示列名。.mode column
:以列对齐的模式显示查询结果,更美观易读。
配合.headers on
使用效果更佳:
sql
sqlite> .headers on
sqlite> .mode column
sqlite> SELECT * FROM students;
id name age major enroll_date
-- ---- --- ------------ -----------
1 张三 20 计算机科学 2023-10-27
3 王五 21 历史学 2023-10-27.quit
或.exit
:退出 SQLite 命令行环境。
总结与展望
恭喜你!通过本教程的学习,你已经掌握了 SQLite 的基本操作,从安装环境、创建数据库和表,到使用 SQL 进行最核心的增、删、改、查操作,再到管理表结构和使用便捷的点命令。你已经具备了使用 SQLite 解决实际问题的基本能力。
我们今天所学的只是冰山一角。SQLite 的世界还有更多值得探索的领域:
- 多表查询 (JOINs):如何从多个关联的表中获取数据。
- 索引 (Indexes):如何创建索引来大幅提升查询速度。
- 事务 (Transactions):如何确保一系列操作要么全部成功,要么全部失败,保证数据的一致性。
- 视图 (Views):创建虚拟表来简化复杂的查询。
- 与编程语言结合:在 Python, Java, Node.js, Go 等语言中使用 SQLite 库,将数据库能力集成到你的应用程序中。
数据库是现代软件开发的基石。今天你迈出的这一小步,是通往更广阔技术世界的重要一步。继续保持好奇心,不断实践,你会发现 SQLite 这个小而美的工具,将在你的学习和工作中发挥巨大的作用。