目录
[0. 基础概念](#0. 基础概念)
[1. SQL 基础语法(通用 + SQLite 特性)](#1. SQL 基础语法(通用 + SQLite 特性))
[1.1 数据定义(DDL)](#1.1 数据定义(DDL))
[1.2 数据操作(DML)](#1.2 数据操作(DML))
[1.3 查询(SELECT)](#1.3 查询(SELECT))
[2. SQLite 特有/特别重要的点](#2. SQLite 特有/特别重要的点)
[2.1 类型系统(动态类型)](#2.1 类型系统(动态类型))
[2.2 NULL 与默认值](#2.2 NULL 与默认值)
[2.3 内置函数 & 表达式](#2.3 内置函数 & 表达式)
[2.4 视图 / 虚表](#2.4 视图 / 虚表)
[3. 事务、锁与并发(面试超级高频)](#3. 事务、锁与并发(面试超级高频))
[3.1 事务基础](#3.1 事务基础)
[3.2 锁机制](#3.2 锁机制)
[3.3 事务隔离级别](#3.3 事务隔离级别)
[4. 索引与性能优化](#4. 索引与性能优化)
[4.1 索引基础](#4.1 索引基础)
[4.2 查询优化](#4.2 查询优化)
[4.3 Vacuum / Analyze](#4.3 Vacuum / Analyze)
[5. 数据完整性与约束](#5. 数据完整性与约束)
[6. 文件、配置与工具](#6. 文件、配置与工具)
[7. WAL 日志(Write-Ahead Logging)](#7. WAL 日志(Write-Ahead Logging))
[8. 与应用集成(Android / 嵌入式常问)](#8. 与应用集成(Android / 嵌入式常问))
[9. 与其他数据库/场景的选择对比(面试经常会问)](#9. 与其他数据库/场景的选择对比(面试经常会问))
[10. 面试常见题型示例(可以照着练)](#10. 面试常见题型示例(可以照着练))
0. 基础概念
-
SQLite 是什么?
-
轻量级、嵌入式、无服务器(serverless)、零配置的关系型数据库
-
常见使用场景:移动端(Android/iOS)、桌面应用、本地缓存、嵌入式设备等
-
-
SQLite 的文件结构
-
数据库存储为单一
.db/.sqlite文件 -
多个连接/进程如何共享这个文件(文件锁概念)
-
-
与 MySQL / PostgreSQL 的区别
-
无独立服务进程,没有"用户/权限管理"、没有"网络协议"
-
适合小型/单机应用,不适合高并发、分布式、超大数据量
-
事务隔离与锁粒度的差异(SQLite 以文件锁为主)
-
1. SQL 基础语法(通用 + SQLite 特性)
1.1 数据定义(DDL)
-
CREATE TABLE基本语法- 列名、类型、
PRIMARY KEY、NOT NULL、DEFAULT等
- 列名、类型、
-
表约束
-
PRIMARY KEY(主键) -
UNIQUE(唯一约束) -
CHECK(检查约束) -
FOREIGN KEY(外键)------注意 默认可能是关闭的,需要PRAGMA foreign_keys = ON;
-
-
ALTER TABLE在 SQLite 中的限制-
早期只支持
RENAME TABLE、ADD COLUMN -
删除列 / 修改列类型的局限 & 常见 workaround:
-
新建表
-
迁移数据
-
删除旧表
-
重命名新表
-
-
-
DROP TABLE的注意点(级联删除外键对象)
1.2 数据操作(DML)
-
INSERT/UPDATE/DELETE基本用法 -
INSERT OR REPLACE、INSERT OR IGNORE -
UPDATE ... WHERE ...省略WHERE的风险(全表更新) -
RETURNING子句(高版本 SQLite 支持,面试可简单了解)
1.3 查询(SELECT)
-
基本查询:
SELECT ... FROM ... WHERE -
排序:
ORDER BY -
分页:
LIMIT/OFFSET -
聚合:
COUNT/SUM/AVG/MIN/MAX+GROUP BY/HAVING -
连接:
INNER JOIN/LEFT JOIN(重点) -
子查询:
-
标量子查询
-
IN (SELECT ...) -
EXISTS
-
-
常见面试点:
-
找重复记录
-
Top N 查询
-
统计每组数量、取每组最新一条数据等
-
2. SQLite 特有/特别重要的点
2.1 类型系统(动态类型)
-
SQLite 的"类型亲和性"(type affinity)
-
INTEGER、REAL、TEXT、BLOB、NUMERIC -
列类型 vs 实际存储类型:列可以声明类型,但实际检查不强(动态类型)
-
-
INTEGER PRIMARY KEY的特殊意义-
行 ID(ROWID)的别名
-
AUTOINCREMENT的行为与影响(不要乱用)
-
2.2 NULL 与默认值
-
NULL的比较规则 (IS NULL,IS NOT NULLvs=) -
默认值
DEFAULT的写法与使用场景 -
COALESCE()函数的使用
2.3 内置函数 & 表达式
-
字符串函数:
SUBSTR、LENGTH、UPPER、LOWER等 -
时间日期函数:
date,datetime,strftime,CURRENT_TIMESTAMP等 -
数学函数
-
CASE WHEN表达式:业务逻辑常用
2.4 视图 / 虚表
-
CREATE VIEW、DROP VIEW -
视图的使用场景(复用复杂查询、做权限隔离------虽然 SQLite 权限弱,但可逻辑隔离)
-
虚拟表(Virtual Table)的概念
- 如 FTS(全文搜索)表、
fts5等 ------ 了解即可,面试加分项
- 如 FTS(全文搜索)表、
3. 事务、锁与并发(面试超级高频)
3.1 事务基础
-
事务的四大特性 ACID
-
在 SQLite 中开启事务的方式:
-
BEGIN [DEFERRED | IMMEDIATE | EXCLUSIVE] TRANSACTION; -
COMMIT;/ROLLBACK;
-
-
自动提交模式:不显式
BEGIN时,每条语句自动变成一个事务
3.2 锁机制
-
SQLite 锁的级别
SHARED、RESERVED、PENDING、EXCLUSIVE
-
写入时整个数据库文件会被加写锁(并发写限制)
-
多读单写的基本模型:
-
多个读取可以并发
-
写入会阻塞/被阻塞
-
3.3 事务隔离级别
-
SQLite 实际提供的隔离效果(通常类似于
SERIALIZABLE的行为,但细节要理解) -
PRAGMA read_uncommitted的含义(是否允许脏读,默认关闭)
4. 索引与性能优化
4.1 索引基础
-
CREATE INDEX/CREATE UNIQUE INDEX -
什么时候需要索引:
- 经常在
WHERE、JOIN、ORDER BY中出现的列
- 经常在
-
复合索引(多列索引)的顺序问题
-
索引缺点:
-
占用空间
-
增删改变慢
-
4.2 查询优化
-
EXPLAIN QUERY PLAN:查看执行计划 -
避免在索引列上使用函数/计算(会导致索引失效)
-
合理使用
LIMIT、分页查询 -
避免
SELECT *,只取需要的列
4.3 Vacuum / Analyze
-
VACUUM:-
作用:压缩数据库文件、回收空间、重建数据库文件
-
何时需要:大量删除后
-
-
ANALYZE:收集统计信息,帮助优化器选择更好执行计划
5. 数据完整性与约束
-
主键和唯一约束的区别
-
外键约束
-
如何开启:
PRAGMA foreign_keys = ON; -
级联操作:
ON DELETE CASCADE,ON UPDATE CASCADE等
-
-
CHECK约束的使用(简单业务规则) -
触发器(Trigger)
-
CREATE TRIGGER基本语法:BEFORE/AFTER INSERT/UPDATE/DELETE -
典型场景:日志审计、派生字段、复杂校验
-
6. 文件、配置与工具
-
SQLite 命令行工具(
sqlite3)基础-
打开数据库:
sqlite3 my.db -
.tables,.schema,.dump,.mode,.headers等常用命令
-
-
.dump备份与恢复 -
数据库备份策略:复制文件 vs 逻辑导出
-
PRAGMA常见设置:-
PRAGMA foreign_keys -
PRAGMA journal_mode(例如 WAL) -
PRAGMA synchronous(性能 vs 安全的权衡) -
PRAGMA cache_size等
-
7. WAL 日志(Write-Ahead Logging)
-
journal_mode的几种模式:DELETE,TRUNCATE,PERSIST,WAL等 -
WAL 模式的优点:
-
读写并发更好(读不阻塞写)
-
崩溃恢复更安全
-
-
WAL 模式的注意点:
-
多进程/网络文件系统(NFS)上的限制
-
会生成
.db-wal/.db-shm文件
-
8. 与应用集成(Android / 嵌入式常问)
-
在应用中如何访问 SQLite
- 最经典:Android 的
SQLiteOpenHelper、iOS 的各种封装库(了解即可)
- 最经典:Android 的
-
连接池/单例连接的必要性
-
线程安全问题:
-
一个连接能否多线程共用
-
是否需要在外层做串行访问
-
-
SQL 注入防御
-
使用参数化查询 / 预编译语句(
?占位符) -
不要拼接用户输入字符串
-
9. 与其他数据库/场景的选择对比(面试经常会问)
-
什么时候选 SQLite?
- 单机、小规模、内嵌、本地缓存、离线应用
-
什么时候不适合?
-
高并发写入
-
复杂权限/多租户
-
分布式、多节点集群
-
-
如果需要从 SQLite 迁移到 MySQL / PostgreSQL:
-
类型系统差异
-
约束、触发器、存储过程的差异
-
10. 面试常见题型示例(可以照着练)
你可以把下面这些当作训练方向:
-
说说 SQLite 和 MySQL 的区别,以及你会在什么场景下用 SQLite?
-
解释一下 SQLite 的类型系统,为什么说它是"弱类型/动态类型"?
-
讲讲 SQLite 的事务机制与锁机制,它如何保证数据一致性?
-
什么时候会用
INTEGER PRIMARY KEY?AUTOINCREMENT有什么坑? -
你如何在 SQLite 中优化一个慢查询?从哪里入手?
-
介绍一下 WAL 模式,它解决了什么问题,有什么代价?
-
如何在 SQLite 中保证外键约束?需要额外开启什么设置?
-
大量删除数据之后,为什么数据库文件没有变小?你会怎么处理?
-
给一个复杂统计 SQL 让你写,比如"统计每个用户最近一次登录时间并按时间排序分页显示"。
-
第 1--2 天:SQL 基础 + SQLite 类型系统
-
第 3--4 天:事务 + 锁 + 索引
-
第 5--6 天:WAL + PRAGMA + 性能优化
-
第 7 天:实战题目 & 模拟面试