00-7天攻破sqlite数据库(总览sqlite)

目录

[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 KEYNOT NULLDEFAULT
  • 表约束

    • PRIMARY KEY(主键)

    • UNIQUE(唯一约束)

    • CHECK(检查约束)

    • FOREIGN KEY(外键)------注意 默认可能是关闭的,需要 PRAGMA foreign_keys = ON;

  • ALTER TABLE 在 SQLite 中的限制

    • 早期只支持 RENAME TABLEADD COLUMN

    • 删除列 / 修改列类型的局限 & 常见 workaround:

      1. 新建表

      2. 迁移数据

      3. 删除旧表

      4. 重命名新表

  • DROP TABLE 的注意点(级联删除外键对象)

1.2 数据操作(DML)

  • INSERT/UPDATE/DELETE 基本用法

  • INSERT OR REPLACEINSERT 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)

    • INTEGERREALTEXTBLOBNUMERIC

    • 列类型 vs 实际存储类型:列可以声明类型,但实际检查不强(动态类型)

  • INTEGER PRIMARY KEY 的特殊意义

    • 行 ID(ROWID)的别名

    • AUTOINCREMENT 的行为与影响(不要乱用)

2.2 NULL 与默认值

  • NULL 的比较规则 (IS NULL, IS NOT NULL vs =)

  • 默认值 DEFAULT 的写法与使用场景

  • COALESCE() 函数的使用

2.3 内置函数 & 表达式

  • 字符串函数:SUBSTRLENGTHUPPERLOWER

  • 时间日期函数:date, datetime, strftime, CURRENT_TIMESTAMP

  • 数学函数

  • CASE WHEN 表达式:业务逻辑常用

2.4 视图 / 虚表

  • CREATE VIEWDROP VIEW

  • 视图的使用场景(复用复杂查询、做权限隔离------虽然 SQLite 权限弱,但可逻辑隔离)

  • 虚拟表(Virtual Table)的概念

    • 如 FTS(全文搜索)表、fts5 等 ------ 了解即可,面试加分项

3. 事务、锁与并发(面试超级高频)

3.1 事务基础

  • 事务的四大特性 ACID

  • 在 SQLite 中开启事务的方式:

    • BEGIN [DEFERRED | IMMEDIATE | EXCLUSIVE] TRANSACTION;

    • COMMIT; / ROLLBACK;

  • 自动提交模式:不显式 BEGIN 时,每条语句自动变成一个事务

3.2 锁机制

  • SQLite 锁的级别

    • SHAREDRESERVEDPENDINGEXCLUSIVE
  • 写入时整个数据库文件会被加写锁(并发写限制)

  • 多读单写的基本模型:

    • 多个读取可以并发

    • 写入会阻塞/被阻塞

3.3 事务隔离级别

  • SQLite 实际提供的隔离效果(通常类似于 SERIALIZABLE 的行为,但细节要理解)

  • PRAGMA read_uncommitted 的含义(是否允许脏读,默认关闭)


4. 索引与性能优化

4.1 索引基础

  • CREATE INDEX / CREATE UNIQUE INDEX

  • 什么时候需要索引:

    • 经常在 WHEREJOINORDER 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 的各种封装库(了解即可)
  • 连接池/单例连接的必要性

  • 线程安全问题:

    • 一个连接能否多线程共用

    • 是否需要在外层做串行访问

  • SQL 注入防御

    • 使用参数化查询 / 预编译语句(? 占位符)

    • 不要拼接用户输入字符串


9. 与其他数据库/场景的选择对比(面试经常会问)

  • 什么时候选 SQLite?

    • 单机、小规模、内嵌、本地缓存、离线应用
  • 什么时候不适合?

    • 高并发写入

    • 复杂权限/多租户

    • 分布式、多节点集群

  • 如果需要从 SQLite 迁移到 MySQL / PostgreSQL:

    • 类型系统差异

    • 约束、触发器、存储过程的差异


10. 面试常见题型示例(可以照着练)

你可以把下面这些当作训练方向:

  • 说说 SQLite 和 MySQL 的区别,以及你会在什么场景下用 SQLite?

  • 解释一下 SQLite 的类型系统,为什么说它是"弱类型/动态类型"?

  • 讲讲 SQLite 的事务机制与锁机制,它如何保证数据一致性?

  • 什么时候会用 INTEGER PRIMARY KEYAUTOINCREMENT 有什么坑?

  • 你如何在 SQLite 中优化一个慢查询?从哪里入手?

  • 介绍一下 WAL 模式,它解决了什么问题,有什么代价?

  • 如何在 SQLite 中保证外键约束?需要额外开启什么设置?

  • 大量删除数据之后,为什么数据库文件没有变小?你会怎么处理?

  • 给一个复杂统计 SQL 让你写,比如"统计每个用户最近一次登录时间并按时间排序分页显示"。

  • 第 1--2 天:SQL 基础 + SQLite 类型系统

  • 第 3--4 天:事务 + 锁 + 索引

  • 第 5--6 天:WAL + PRAGMA + 性能优化

  • 第 7 天:实战题目 & 模拟面试

相关推荐
Access开发易登软件2 小时前
Access导出带图表的 HTML 报表:技术实现详解
数据库·后端·html·vba·导出·access
_Minato_2 小时前
数据库知识整理——SQL数据定义
数据库·sql·mysql·oracle·database·数据库开发·数据库架构
程序员卷卷狗2 小时前
MySQL 四种隔离级别:从脏读到幻读的全过程
数据库·mysql
l1t3 小时前
改写ITPUB newkid的求解数独DuckDB SQL为Clickhouse格式
数据库·sql·clickhouse·duckdb
国服第二切图仔3 小时前
鸿蒙应用开发之实现键值型数据库跨设备数据同步
数据库·wpf·harmonyos
盒马coding5 小时前
PostgreSQL18新功能COPY命令变得更加用户友好
数据库·postgresql
️️(^~^)5 小时前
触发器,存储过程
数据库
罗光记5 小时前
Quantinuum 发布新型量子计算机“Helios“
数据库·经验分享·其他·百度·twitter
友友马5 小时前
『 数据库 』MySQL索引深度解析:从数据结构到B+树的完整指南
数据库·mysql