数据库 & SQL 知识体系
这一部分按 基础 → 进阶 → 高阶 三层组织,既覆盖 SQL 语言本身,也覆盖 InnoDB 存储引擎、索引、事务、执行计划这些在面试与生产中真正拉开差距的内容。
除非特别说明,全部示例基于 MySQL 8.0 + InnoDB;涉及 PostgreSQL / Oracle 的差异会单独标注。
学习路线
| 层次 | 主题 | 目标 |
|---|---|---|
| 基础 | SQL 基础语法 | 逻辑执行顺序、三值逻辑、过滤排序分页、内置函数、DML |
| 进阶 | 连接查询 | 内连接 / 外连接 / 自连接 / 半连接,以及 ON 与 WHERE 的本质区别 |
| 进阶 | 聚合与分组 | 聚合函数、GROUP BY / HAVING、条件聚合、行列转换 |
| 进阶 | 子查询与 CTE | 标量 / 行 / 表子查询、相关子查询、EXISTS、WITH 与递归 CTE |
| 高阶 | 窗口函数 | 排名、累计、移动窗口、LAG / LEAD、frame 边界语义 |
| 高阶 | 索引原理 | B+ 树、聚簇索引、回表、联合索引最左前缀、覆盖索引、索引失效 |
| 高阶 | 事务与锁 | ACID、隔离级别、MVCC、记录锁 / 间隙锁 / 临键锁、死锁 |
| 高阶 | 执行计划与调优 | EXPLAIN、连接算法、深分页、慢查询定位、统计信息 |
| 高阶 | 表结构设计 | 范式与反范式、数据类型选型、约束、分区与分库分表 |
统一示例库
下面这套表贯穿各篇示例,可直接建库跑通。
CREATE TABLE department (
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
UNIQUE KEY uk_name (name)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;
CREATE TABLE employee (
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
department_id INT UNSIGNED NULL,
manager_id INT UNSIGNED NULL, -- 自关联:上级
salary DECIMAL(12, 2) NOT NULL DEFAULT 0,
hired_at DATE NOT NULL,
KEY idx_dept_salary (department_id, salary), -- 联合索引,后面反复用到
KEY idx_hired (hired_at)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;
CREATE TABLE orders (
id BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
user_id INT UNSIGNED NOT NULL,
amount DECIMAL(12, 2) NOT NULL,
status TINYINT NOT NULL DEFAULT 0, -- 0 待付款 1 已付款 2 已取消
created_at DATETIME NOT NULL,
KEY idx_user_created (user_id, created_at)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;
如何使用这份资料
- 先把基础篇里的逻辑执行顺序和 NULL 三值逻辑吃透,它们是后面所有内容的地基;
- 进阶三篇(连接 / 分组 / 子查询)配合 LeetCode 题目练手;
- 高阶部分不要死记结论,重点理解 B+ 树结构 → 回表代价 → 优化器如何选择这条主线。
