SQLite 常用命令与核心语法全能速查表 (SQLite CheatSheet)
专为轻量级与嵌入式开发者整理的 SQLite 全能速查表,涵盖 sqlite3 点命令、核心 PRAGMA 调优配置、内置函数、UPSERT 语法及编程语言连接实例。
发布于
SQLite 作为全球安装量最大的嵌入式轻量级关系型数据库,广泛应用于移动端(iOS / Android)、桌面客户端(Electron)、边缘计算设备及轻量级服务端开发。
由于其零配置(Serverless)、单文件存储以及独特的动态类型机制,SQLite 在使用体验上与传统数据库存在诸多差异。本文为您整理了一份案头必备的 SQLite 常用技能全景速查。
一、 sqlite3 命令行终端核心“点命令” (Dot Commands)
在终端运行 sqlite3 mydatabase.db 进入交互式环境后,所有以点(.)开头的指令均属于命令行专用元命令:
| 点命令 | 功能与用法说明 | 实用技巧 / 示例 |
|---|---|---|
.help |
查看所有可用的点命令清单 | 随时查阅帮助 |
.databases |
查看当前已附加(ATTACH)的数据库文件与路径 | 检查多库挂载 |
.tables 或 .tables pattern |
列出当前数据库的所有表名 | .tables user* 模糊匹配 |
.schema table_name |
查看建表 DDL 语句与索引定义 | 查看表结构与约束 |
.mode format |
切换输出呈现格式 | .mode box(表格框,推荐).mode csv(CSV 格式).mode json(JSON 数组).mode column(对齐列) |
.headers on/off |
开启或关闭查询结果的表头字段名显示 | 建议默认 .headers on |
.import file table |
将 CSV 或文本文件直接导入到指定数据表 | .import --csv data.csv users |
.dump [table] |
将整库或指定表导出为标准 SQL 文本文件 | .dump > backup.sql |
.read filename.sql |
读取并执行外部 SQL 脚本文件 | .read /tmp/init.sql |
.open filename.db |
关闭当前库并打开新的数据库文件 | 随时切换数据库 |
.quit 或 .exit |
退出 sqlite3 控制台 | 快捷键 Ctrl + D |
[!TIP] 推荐在个人根目录创建
~/.sqliterc文件,写入以下两行,每次打开 sqlite3 即可默认享受美观排版:.headers on .mode box
二、 生产必备:核心 PRAGMA 性能与安全调优
SQLite 默认的开箱配置更倾向于极致的极端断电安全(保守写入),通过调整几条关键的 PRAGMA 指令,能够让 SQLite 的写入吞吐量暴增 5~10 倍!
1. 开启 WAL 预写日志模式(大幅提升并发读写)
-- 强烈推荐!开启 Write-Ahead Logging 模式,实现读写互不阻塞
PRAGMA journal_mode = WAL;
- 默认模式下(Rollback Journal),只要有写事务,所有读操作就会被锁住。
- 开启
WAL后,读操作读取主数据库文件,写操作追加写入-wal文件,支持多个读者和一个写者完全并发并发!
2. 调整同步刷盘级别 (synchronous)
-- 在 WAL 模式下推荐设置为 NORMAL,极大提升写入性能且依然保持断电 ACID 安全
PRAGMA synchronous = NORMAL;
3. 必须显式开启外键约束检查
-- 重要:SQLite 出于向下兼容,默认不强制校验外键!每个连接需显式开启:
PRAGMA foreign_keys = ON;
4. 调整内存缓存大小与临时存储
-- 将缓存扩大到 64MB (默认仅 2MB)
PRAGMA cache_size = -64000;
-- 临时表和索引放在内存中处理,提升复杂聚合与 ORDER BY 速度
PRAGMA temp_store = MEMORY;
三、 表定义与现代 SQL 语法特性
1. 经典建表范例(包含自增主键与 JSON 约束)
CREATE TABLE IF NOT EXISTS articles (
id INTEGER PRIMARY KEY AUTOINCREMENT, -- 必须为 INTEGER PRIMARY KEY
title TEXT NOT NULL,
slug TEXT NOT NULL UNIQUE,
content TEXT DEFAULT '',
tags JSON DEFAULT '[]', -- SQLite 原生支持 JSON 字段
view_count INTEGER DEFAULT 0,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
2. UPSERT 语法(存在则更新,不存在则插入)
SQLite 3.24.0+ 原生支持标准 ON CONFLICT 语法:
INSERT INTO articles (slug, title, view_count)
VALUES ('mysql-tutorial', 'MySQL 入门教程', 1)
ON CONFLICT(slug) DO UPDATE SET
view_count = articles.view_count + 1,
title = excluded.title;
四、 常用内置函数速查
1. 字符串与聚合函数
| 函数 | 功能说明 | 语法示例 |
|---|---|---|
LENGTH(str) |
字符数(如果是 BLOB 则返回字节数) | SELECT LENGTH('数据库'); -- 3 |
LOWER(str) / UPPER(str) |
大小写转换 | SELECT LOWER('SQLite'); |
SUBSTR(str, pos, len) |
字符串截取(起始索引为 1) | SELECT SUBSTR('Hello World', 1, 5); -- Hello |
REPLACE(str, from, to) |
字符串全局替换 | SELECT REPLACE('abc_def', '_', '-'); |
TRIM(str) / LTRIM / RTRIM |
剔除两端或单端空白 | SELECT TRIM(' test '); |
INSTR(str, substr) |
查找子串首次出现位置 | SELECT INSTR('database', 'base'); -- 5 |
GROUP_CONCAT(expr, sep) |
组内字符串拼接 | SELECT dept, GROUP_CONCAT(name, ', ') FROM emp GROUP BY dept; |
COALESCE(v1, v2, ...) |
返回首个非 NULL 的值 | SELECT COALESCE(nickname, username, '匿名'); |
2. 日期与时间函数(SQLite 独特时间处理)
SQLite 内部没有独立的日期数据类型,通常以 TEXT(ISO-8601 字符串)或 INTEGER(Unix 时间戳)存储:
-- 1. 获取当前 UTC 日期时间与本地时间
SELECT datetime('now'); -- UTC 时间: 2026-10-31 06:00:00
SELECT datetime('now', 'localtime'); -- 本地时区时间
-- 2. 日期加减与区间运算
SELECT date('now', '+7 days'); -- 7 天后
SELECT datetime('now', '-1 month'); -- 1 个月前
SELECT datetime('now', 'start of month'); -- 本月第 1 天 0 点
-- 3. 格式化输出 (STRFTIME)
SELECT strftime('%Y-%m-%d %H:%M:%S', 'now', 'localtime');
3. 原生 JSON 函数 (JSON1 模块)
-- 提取 JSON 字段内容
SELECT json_extract('{"name": "Alice", "skills": ["SQL", "Go"]}', '$.name'); -- "Alice"
-- 判断 JSON 是否包含有效结构
SELECT json_valid('{"valid": true}'); -- 返回 1
-- 在查询结果中直接生成 JSON 对象
SELECT json_object('id', id, 'title', title) FROM articles;
五、 主流编程语言极速连接代码片段
Python (标准内置库,无需安装依赖)
import sqlite3
# 连接数据库(若文件不存在会自动创建)
conn = sqlite3.connect("database.db")
cursor = conn.cursor()
# 开启 WAL 模式提升吞吐量
cursor.execute("PRAGMA journal_mode = WAL;")
cursor.execute("SELECT id, title FROM articles WHERE view_count > ?", (100,))
rows = cursor.fetchall()
for row in rows:
print(row)
conn.close()
Node.js (better-sqlite3 极致性能库)
const Database = require('better-sqlite3');
const db = new Database('database.db');
// 开启 WAL 模式
db.pragma('journal_mode = WAL');
const stmt = db.prepare('SELECT id, title FROM articles WHERE id = ?');
const article = stmt.get(1);
console.log(article);
结语
本速查表涵盖了 SQLite 日常交互、底层调优与高频内置函数的关键用法。关于 SQLite 每一个函数的详细运行参数与返回结果示例,请参阅本站的 SQLite 函数参考手册。