作为一名程序员,你一定听说过 SQLite—— 这款轻量级嵌入式数据库凭借 “零配置、免安装、文件式存储” 的特性,成为移动端、嵌入式设备、小型工具的首选数据库。如果你是刚接触 SQLite 的新手,本文将带你快速掌握日常开发中最常用的指令,从入门到上手实战,一篇搞定!

一、认识 SQLite:为什么它值得学?

在开始之前,先简单聊聊 SQLite 的特点,帮你理解它的适用场景:

  • 无需服务:不像 MySQL、PostgreSQL 需要单独启动服务,SQLite 直接通过文件操作,一个 .db 文件就是一个数据库。
  • 跨平台:支持 Windows、Linux、Mac,甚至手机(Android/iOS 内置 SQLite)。
  • 轻量级:库文件体积不到 600KB,适合资源有限的场景。
  • ACID 兼容:支持事务的原子性、一致性、隔离性、持久性,数据安全有保障。

日常开发中,日志存储、本地缓存、小型工具数据管理等场景,用 SQLite 再合适不过了。

二、准备工作:安装与启动

1. 安装 SQLite

  • Windows:去 SQLite 官网 下载 sqlite-tools-win32-x86-xxxx.zip,解压后得到 sqlite3.exe,放到任意目录,再将该目录添加到系统环境变量。
  • Linux/Mac:通常自带 SQLite,终端输入 sqlite3 即可启动,若没有则用包管理器安装(如 sudo apt install sqlite3)。

2. 启动与退出

终端输入以下命令,创建或打开一个数据库文件(若 test.db 不存在则自动创建):

sqlite3 test.db  # 启动并关联 test.db 数据库

退出数据库交互模式:

.quit  # 或 .exit

三、数据库操作:基础中的基础

1. 查看当前数据库信息

刚进入交互模式时,先看看当前连接的数据库:

.databases  # 显示数据库文件路径

输出示例:

main: /home/user/test.db

2. 查看所有表结构

想知道数据库里有哪些表,以及表的定义?用这个:

.schema  # 查看所有表的创建语句
.schema 表名  # 查看指定表的创建语句

四、表操作:创建、修改与删除

表是数据库的核心,先学会如何创建和管理表。

1. 创建表(CREATE TABLE)

基本语法:

CREATE TABLE [IF NOT EXISTS] 表名 (
  列名1 数据类型 [约束],
  列名2 数据类型 [约束],
  ...
  [PRIMARY KEY (列名)]  -- 主键约束
);

实战案例:创建一个 users 表存储用户信息:

CREATE TABLE IF NOT EXISTS users (
  id INTEGER PRIMARY KEY AUTOINCREMENT,  -- 自增主键(唯一标识用户)
  name TEXT NOT NULL,                     -- 用户名,非空约束
  age INTEGER CHECK(age > 0),             -- 年龄,必须大于0(检查约束)
  email TEXT UNIQUE,                      -- 邮箱,唯一约束(不允许重复)
  create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP  -- 创建时间,默认当前时间
);

说明

  • IF NOT EXISTS:避免表已存在时报错。
  • INTEGER PRIMARY KEY AUTOINCREMENT:自动生成唯一 ID(常用作主键)。
  • 约束(NOT NULLUNIQUE 等)用于保证数据合法性。

2. 查看表结构细节

创建表后,想确认列的类型和约束?用 PRAGMA 指令:

PRAGMA table_info(users);  -- 查看 users 表的列信息

输出示例:

cid  name        type        notnull  dflt_value           pk
---  ----------  ----------  -------  -------------------  --
0    id          INTEGER     0                           1
1    name        TEXT        1                           0
2    age         INTEGER     0                           0
3    email       TEXT        0                           0
4    create_time TIMESTAMP   0        CURRENT_TIMESTAMP    0

3. 修改表(ALTER TABLE)

SQLite 对表的修改支持有限,主要能做两件事:

  • 重命名表:
ALTER TABLE users RENAME TO user_info;  -- 将 users 表改名为 user_info
  • 添加新列:
ALTER TABLE users ADD COLUMN gender TEXT;  -- 给 users 表添加 gender 列

注意:SQLite 不支持直接修改列类型或删除列,若需此类操作,需创建新表并迁移数据(新手暂时不用深究,遇到时再查即可)。

4. 删除表(DROP TABLE)

谨慎操作!删除表会同时删除所有数据

DROP TABLE IF EXISTS users;  -- 删除 users 表(若存在)

五、核心操作:增删改查(CRUD)

这部分是数据库操作的灵魂,必须熟练掌握。

1. 插入数据(INSERT)

向表中添加数据,语法:

INSERT INTO 表名 (列1, 列2, ...) VALUES (值1, 值2, ...);

实战案例

-- 插入一条完整数据
INSERT INTO users (name, age, email) 
VALUES ('张三', 28, 'zhangsan@example.com');

-- 插入部分列(其他列用默认值,如 create_time 会自动填当前时间)
INSERT INTO users (name, age) 
VALUES ('李四', 30);

-- 一次性插入多行
INSERT INTO users (name, email) 
VALUES ('王五', 'wangwu@example.com'), 
       ('赵六', 'zhaoliu@example.com');

2. 查询数据(SELECT)

查询是最常用的操作,语法灵活,先从基础开始:

SELECT 列1, 列2, ... FROM 表名 
[WHERE 条件] 
[ORDER BY 列名 [ASC|DESC]] 
[LIMIT 数量 OFFSET 偏移量];

实战案例

(1)查询所有数据
-- 显示表头(命令行默认不显示,先开启)
.headers on
.mode column  -- 列对齐,更美观

-- 查询所有用户
SELECT * FROM users;

输出示例:

id          name        age         email                 create_time
----------  ----------  ----------  --------------------  -------------------
1           张三         28          zhangsan@example.com  2023-10-30 15:00:00
2           李四         30                                  2023-10-30 15:01:00
3           王五         NULL        wangwu@example.com    2023-10-30 15:02:00
(2)条件查询
-- 查询年龄大于28的用户
SELECT name, age FROM users WHERE age > 28;

-- 查询邮箱不为空的用户
SELECT name, email FROM users WHERE email IS NOT NULL;

-- 模糊查询(名字含“张”)
SELECT * FROM users WHERE name LIKE '%张%';
(3)排序与分页
-- 按年龄升序排列(默认ASC,可省略)
SELECT * FROM users ORDER BY age ASC;

-- 按ID降序,取前2条
SELECT * FROM users ORDER BY id DESC LIMIT 2;

-- 分页:从第2条开始,取2条(OFFSET 1 表示跳过1条)
SELECT * FROM users LIMIT 2 OFFSET 1;
(4)聚合查询

用 COUNTSUMAVG 等函数统计数据:

-- 统计用户总数
SELECT COUNT(*) AS total_users FROM users;

-- 计算平均年龄(忽略NULL值)
SELECT AVG(age) AS avg_age FROM users;

-- 按年龄分组,统计每个年龄段的人数
SELECT age, COUNT(*) AS count FROM users GROUP BY age;

3. 更新数据(UPDATE)

修改已有数据,语法:

UPDATE 表名 SET 列1=值1, 列2=值2 WHERE 条件;

实战案例

-- 将李四的年龄改为31
UPDATE users SET age = 31 WHERE name = '李四';

-- 给所有没有邮箱的用户添加默认邮箱
UPDATE users SET email = 'default@example.com' WHERE email IS NULL;

警告:如果省略 WHERE 条件,会更新表中所有行,务必谨慎!

4. 删除数据(DELETE)

删除表中的数据,语法:

DELETE FROM 表名 WHERE 条件;

实战案例

-- 删除年龄为空的用户
DELETE FROM users WHERE age IS NULL;

-- 删除邮箱为默认值的用户
DELETE FROM users WHERE email = 'default@example.com';

警告:省略 WHERE 条件会删除表中所有数据(表结构保留),操作前一定要确认!

六、进阶技巧:索引与事务

1. 索引:加速查询

当表中数据量很大时,查询会变慢,此时可以给常用查询的列创建索引:

-- 给 email 列创建索引(查询邮箱时会更快)
CREATE INDEX IF NOT EXISTS idx_users_email ON users(email);

-- 查看所有索引
.indexes

注意:索引会加快查询,但会减慢插入 / 更新 / 删除速度(因为索引也要同步更新),只给常用查询的列创建即可。

删除索引:

DROP INDEX IF EXISTS idx_users_email;

2. 事务:保证数据一致性

事务可以将多个操作打包成一个整体,要么全部成功,要么全部失败(避免部分操作生效导致的数据混乱)。

语法:

BEGIN TRANSACTION;  -- 开始事务
-- 执行一系列操作(INSERT/UPDATE/DELETE)
COMMIT;  -- 提交事务(所有操作生效)
ROLLBACK;  -- 回滚事务(放弃所有操作,回到开始前的状态)

实战案例:转账场景(A 减 100,B 加 100,必须同时成功)

BEGIN TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE name = 'A';
UPDATE accounts SET balance = balance + 100 WHERE name = 'B';
COMMIT;  -- 确认无误后提交
-- 若中间出错,执行 ROLLBACK; 撤销操作

七、常用终端命令

除了 SQL 语句,SQLite 命令行还有一些实用的终端命令(以 . 开头):

命令 作用
.help 查看所有终端命令
.headers on 显示查询结果的表头
.mode column 列对齐显示(美观)
.timer on 显示查询执行时间
.output 文件名 将查询结果导出到文件
.read 文件名 执行文件中的 SQL 语句

八、常见问题

1.为什么查询结果没有表头?

命令行默认不显示表头,执行 .headers on 即可开启。

2.如何导出查询结果到 CSV?

sqlite3 your_database.db    --1.先进入数据库
.mode csv                   --2.设置 SQLite 命令行的输出格式为 CSV(逗号分隔值)
.output result.csv          --3.指定查询结果的输出目标为文件 result.csv
SELECT * FROM users;        -- 4.结果会写入 result.csv
.output stdout              -- 5.恢复输出到终端

在 SQLite 中,也可以通过一条组合指令(用分号分隔多个终端命令)将 users 表数据导出为 CSV 文件,无需分步执行。示例如下:

sqlite3 your_database.db ".mode csv; .output users.csv; SELECT * FROM users; .output stdout"

指令解释:

  1. sqlite3 your_database.db:启动 SQLite 并连接到你的数据库文件(替换 your_database.db 为实际数据库名)。
  2. .mode csv:设置输出格式为 CSV。
  3. .output users.csv:指定输出文件为 users.csv(保存在当前终端所在目录)。
  4. SELECT * FROM users:查询 users 表的所有数据(结果会写入 CSV 文件)。
  5. .output stdout:恢复输出到终端(避免后续操作继续写入文件)。

执行后效果:

当前目录会生成 users.csv 文件,包含 users 表的所有数据,可用 Excel、记事本等工具打开。

注意:

  • 若数据库文件不在当前目录,需指定完整路径(如 sqlite3 /path/to/your_database.db ...)。
  • 若 users.csv 已存在,会被自动覆盖。

总结

本文涵盖了 SQLite 常用的指令,从表的创建到数据的增删改查,再到索引和事务的基础用法。SQLite 语法贴近标准 SQL,学会这些基本能应对日常开发需求。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐