SQLite 入门教程:零基础快速上手指南 – wiki基地


SQLite 入门教程:零基础快速上手指南

前言:为什么选择 SQLite?

在数据库的广阔世界里,有像 Oracle、MySQL、PostgreSQL 这样强大而复杂的“巨型航母”,它们功能全面,性能卓越,是大型企业级应用的中流砥柱。但对于许多场景,比如桌面应用、移动 App、小型网站、数据分析原型、甚至是物联网设备,动用这些“航母”无异于“杀鸡用牛刀”。

这时,一个轻量、高效、易用的数据库解决方案就显得尤为重要。SQLite 正是为此而生。

SQLite 是什么?
它是一个 C 语言库,实现了一个小型的、快速的、自给自足的、高可靠性的、功能完备的 SQL 数据库引擎。与大多数其他 SQL 数据库不同,SQLite 不是一个客户端/服务器模型的数据库引擎。相反,它直接被嵌入到最终的程序中。

SQLite 的核心优势:

  1. 零配置(Serverless):没有独立的服务器进程需要安装、配置和管理。你不需要担心端口、用户权限、启动服务等繁琐事务。
  2. 单个文件:整个数据库(包括定义、表、索引和数据)都存储在宿主主机上的一个单一文件中。这使得数据库的复制、移动、备份和共享变得像复制一个普通文件一样简单。
  3. 跨平台:无论你是在 Windows, macOS, Linux, Android 还是 iOS 上,SQLite 都能完美运行。
  4. 公共领域:代码完全开放,你可以自由地用于任何商业或私人目的,无需支付任何费用。
  5. 小巧玲珑:其核心库非常小,非常适合资源受限的环境。

本教程旨在为完全没有数据库经验的初学者提供一份清晰、详尽的路线图。我们将从零开始,一步步带你走进 SQLite 的世界,让你不仅学会如何使用它,更能理解其背后的基本原理。


第一部分:准备工作 – 安装与初体验

在开始编码之前,我们需要先在我们的电脑上准备好 SQLite 环境。

1. 安装 SQLite

Windows 用户:

  1. 访问 SQLite 官方下载页面:https://www.sqlite.org/download.html
  2. 在 “Precompiled Binaries for Windows” 部分,下载 sqlite-tools-win32-*.zip(根据你的系统选择 32 位或 64 位)。这个压缩包里包含了我们将要使用的命令行工具 sqlite3.exe
  3. 解压下载的文件,你会得到一个名为 sqlite3.exe 的可执行文件。
  4. 为了方便在任何目录下都能使用它,建议将其所在的文件夹路径添加到系统的环境变量 (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 sqlitesudo dnf install sqlite

2. 第一次亲密接触:创建你的第一个数据库

安装完成后,让我们来创建并进入一个数据库。操作非常简单。

打开你的命令行工具(Windows 的 cmdPowerShell,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 (...):提供了与前面列名一一对应的值。注意,文本值需要用单引号 ' ' 括起来。
  • 我们没有提供 idenroll_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

使用 ANDOR 进行多条件查询:
查询年龄大于 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 岁。我们可以根据他的 idname 来更新。

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 这个小而美的工具,将在你的学习和工作中发挥巨大的作用。

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部