1. 关系型数据库基础#
必须掌握:数据库、表、行、列、数据类型;主键、外键、唯一、非空、检查约束;一对一、一对多、多对多。
用“订单”理解:用户表不应把所有订单塞进一个字段;订单通过 user_id 外键指向用户;订单与商品是多对多,需要 order_items 中间表。
设计顺序#
- 从需求中找实体:用户、商品、订单;
- 为实体选择稳定主键;
- 明确关系和基数;
- 给必填、唯一、范围等规则加数据库约束;
- 再考虑索引,不要先为每列建索引。
2. SQL 学习顺序#
第一组:基本操作#
CREATE DATABASE/SCHEMA/TABLE;INSERT、SELECT、UPDATE、DELETE;WHERE、AND/OR/NOT、IN、BETWEEN、LIKE、IS NULL;ORDER BY、LIMIT/OFFSET;COUNT/SUM/AVG/MIN/MAX、GROUP BY、HAVING。
警告:执行 UPDATE 或 DELETE 前,先用相同 WHERE 运行 SELECT,确认目标行。
第二组:多表与子查询#
INNER JOIN:只要两边匹配;LEFT JOIN:保留左表全部数据;- 多表连接、表别名;
- 普通子查询、
EXISTS; UNION与UNION ALL。
重点不是背语法,而是能从“我要哪些结果”倒推:结果列 → 来源表 → 连接条件 → 过滤 → 分组 → 排序。
第三组:正确性#
- 事务的 ACID;
BEGIN、COMMIT、ROLLBACK;- 并发修改与隔离级别的基本意义;
- 参数化查询,禁止拼接用户输入形成 SQL;
- 迁移(migration)与种子数据(seed)的用途。
第四组:性能与维护#
- B-tree 索引的直觉;复合索引的列顺序;
- 用
EXPLAIN看执行计划; - 索引加快读取但增加写入和存储成本;
- 备份、恢复、角色和最小权限;
- 连接池;慢查询日志。
后续再学#
窗口函数、CTE、全文检索、分区、复制、高可用、数据库内部原理。窗口函数很实用,可在完成主线项目后优先补。
3. 易错重点#
NULL不是空字符串,也不能用= NULL判断;- 连接条件漏写会产生笛卡尔积;
- 金额不要使用浮点数,使用精确小数或最小货币单位整数;
- 日期时间要明确时区,后端通常统一保存 UTC;
- 应用层校验不能替代数据库约束,两层都要有;
- 密码不保存明文,也不使用普通快速哈希;应使用专用密码哈希;
- 不要把“删除用户”直接级联到所有业务数据,先根据业务和合规要求设计。
4. 必做练习#
以图书借阅系统为题,设计 users、books、authors、book_authors、loans:
- 创建表和全部约束;
- 插入至少 10 用户、20 本书、30 条借阅记录;
- 查询当前未归还图书;
- 查询借阅次数最多的 5 本书;
- 查询从未借书的用户(练习
LEFT JOIN); - 查询逾期记录;
- 用事务完成“借书”:检查库存、创建记录、减少库存,任一步失败全部回滚;
- 为常用查询建立合理索引,并用
EXPLAIN对比; - 导出备份,清空练习库,再恢复并核对行数。
5. 阶段验收#
- 能画出 ER 图并解释每个关系。
- 不看答案写出基本 CRUD、连接、聚合和分页。
- 能解释主键、外键、唯一约束和索引的区别。
- 能用事务保证一组操作要么全部成功、要么全部失败。
- 能识别 SQL 注入风险并改成参数化查询。
- 实际完成过一次备份和恢复。