SQLite 教学工作区 · 速查卡 · 配合课程 0001

sqlite3 命令行速查

一页打完:怎么进、怎么问、怎么看、怎么走。来源是官方 CLI 文档, 不采信二手博客 —— 官方文档滞后时以 sqlite3 --help 与实际行为为准。

进库与退出

命令作用
sqlite3 库文件打开(不存在则创建空库)
sqlite3 -readonly 库文件只读打开,写操作直接报错 —— 看别人的库时最稳
sqlite3 :memory:开一个内存库,关掉就没了(练习用)
.quit / .exit退出

点命令(给工具,不加分号)

命令作用
.tables列出所有表
.schema [表名]看建表语句(表的"结构定义");不带表名则全部
.mode box|column|json|csv切换输出格式(默认 column,box 最好看)
.headers on显示列名
.width / .nullvalue列宽 / 空值显示成什么
.indexes 表名看这张表有哪些索引
.dump [表名]导出成 SQL 文本(可用来迁移/备份)
.read 文件.sql执行一个 SQL 脚本文件
.backup 目标文件在线备份(比 cp 更适合正在写入的库)
.help全部点命令(记不住就看这个)

启动参数(命令行里直接给)

sqlite3 -header -column 库.db "SELECT * FROM 表 LIMIT 5;"   # 一次跑一条,不进交互
sqlite3 -readonly 库.db ".schema"                            # 只看结构
sqlite3 -cmd ".mode box" 库.db                               # 进库前先执行点命令
sqlite3 库.db < 脚本.sql                                     # 批量执行

SQL 骨架(按"最常用"排序)

SELECT 列1, 列2 FROM 表 WHERE 条件 ORDER BY 列 DESC LIMIT 10;
SELECT count(*), 分组列 FROM 表 GROUP BY 分组列;              -- 聚合
SELECT a.列, b.列 FROM a JOIN b ON a.id = b.a_id;             -- 连接
INSERT INTO 表 (列1, 列2) VALUES ('值1', 2);
UPDATE 表 SET 列1 = '新值' WHERE 条件;
DELETE FROM 表 WHERE 条件;

CREATE TABLE 表 (id INTEGER PRIMARY KEY, 名称 TEXT NOT NULL, 创建时间 INTEGER);
CREATE INDEX 索引名 ON 表 (列);                               -- 上索引
BEGIN; ... COMMIT;   -- 或 ... ROLLBACK;                      -- 事务
EXPLAIN QUERY PLAN SELECT ...;                                -- 看有没有走索引

三个必记的事实

  1. 库 = 一个文件。没有服务器、没有端口、没有账号。cp 就是备份(库正在写时改用 .backup)。
  2. 类型是"建议"不是"约束"。SQLite 允许往 INTEGER 列里塞文本(除非加 STRICT 表),这叫动态类型 —— 好处是灵活,代价是容易自己坑自己。
  3. 并发写只有一个。多个读者可以同时读,但写会加锁;跨进程高频写入、或把库放在网络盘上,都会出问题 —— 官方在 When To Use SQLite 里划了界线。

Windows 上的编码坑

数据本身永远是 UTF-8。乱码发生在控制台:代码页不是 UTF-8 时,你写进命令行的中文(比如列别名 AS 内容)会先被转坏。

chcp 65001                     # 切 UTF-8 代码页(Git Bash: chcp.com 65001)
sqlite3 -header -column 库.db "SELECT project_path FROM memories LIMIT 3;"

相关

课程:0001 打开你机器上的一个真库 · 资源清单:RESOURCES.md · 使命:MISSION.md