Skip to content

MySQL 必知必会(第 2 版) ​

这本书适合第一次系统学习 MySQL,或已经会写简单查询、希望补齐 SQL 基础的读者。本专题沿用全书的学习顺序组织六个单元,配合同一套「课程报名」数据,从解释每一行的含义开始,逐步写出查询、报表、写入事务与维护实验。

本站内容是独立编写的导读、学习笔记和练习,不是图书原文或逐章译文;章号用于对照阅读。书中完整讲解与挑战题请阅读正版图书。

这次整理已阅读 Pearson 公开的第 2 版样章 PDF,其中包含前言、目录、第 1 章及索引,不能视作全书正文。其余主题依据作者配套资源、MySQL 官方参考手册与本站自建实验展开。每个单元都尽量说明「概念解决什么问题、SQL 如何产生结果、常见错误为什么发生、如何核验和清理实验」,不把尚未获取的原书内容当成已经通读。

版本与书目信息 ​

项目信息
中文书名《MySQL 必知必会(第 2 版)》
作者本·福达(Ben Forta)
译者刘晓霞、钟鸣
出版社 / 出品方人民邮电出版社 / 图灵教育
中文版出版时间2024 年 10 月
中文版 ISBN9787115651884
篇幅272 页,30 章及 5 个附录
英文原作MySQL Crash Course, 2nd Edition,2023 年
版本基线第 2 版针对 MySQL 8 修订;本站以 MySQL 8.4 为实验基线,涉及 8.0 小版本差异时单独说明

书目核对于 2026-10-31:中文版书目、出版社页面、作者第 2 版页面。请用 ISBN 区分 2009 年的中文第 1 版;《SQL 必知必会》是另一部书。

阅读路线 ​

下表是本站按章号组织的学习单元,标题为本站概括。原书目录可在作者页面查看。

对应章节本站笔记完成后应能做到
第 1~3 章01 · 连接数据库与准备练习数据区分服务端与客户端,理解表、主键和外键,准备三张练习表
第 4~9 章02 · 检索、排序与条件过滤正确组合 SELECT、WHERE、ORDER BY、LIMIT,并处理 NULL、通配符和正则
第 10~18 章03 · 计算、汇总与多表查询计算报名收入,保留零报名课程,使用子查询、连接、集合与全文检索
第 19~22 章04 · 数据写入、表结构与视图指定插入列、验证更新范围,并区分表结构与视图
第 23~26 章05 · 存储程序与事务边界调用存储过程,理解游标与触发器,用事务和保存点恢复数据
第 27~30 章06 · 字符集、权限与运行维护检查字符集,分配最小权限,演练备份恢复并阅读执行计划

附录可作为随手查阅的工具:安装准备、示例表、SQL 语法、数据类型和关键字。本站练习使用自建数据;跟做原书案例时,请单独导入作者配套数据,不要混用表名。

六个单元具体学什么 ​

第一单元先解决「为什么要有三张表」:学员、课程与报名分别描述不同事实,主外键让事实之间的关系可检查。接着区分客户端、服务端、连接与数据库,处理初学时常见的连接失败、未选库和语句未结束,再建立可复用的数据基线。

第二单元把一条查询拆成数据来源、行过滤、列选择、排序和分页。重点不只是记语法,还包括 DISTINCT 对整行去重、多个排序字段的优先级、NULL 的三值逻辑、NOT IN 的空值陷阱,以及 LIKE 与正则适合解决的不同问题。

第三单元篇幅较长,建议分三次完成:先学表达式与聚合,明确每次报名和每位学员的统计口径;再学分组、子查询与连接,推导外连接的补位行和一对多关系造成的重复;最后比较 UNION 与全文检索,并完成包含零报名对象的报表。

第四单元围绕写入后的状态展开:显式列名、多行插入、查询结果搬运、更新影响行数、外键阻止删除、DDL 隐式提交、约束与可更新视图。每次写入都观察事务内结果与回滚后结果,避免只看到「执行成功」就认为操作正确。

第五单元从存储过程的参数与分隔符讲到处理器、游标结束条件、触发器的 OLD/NEW 和异常回滚范围;再用保存点与两个独立连接观察事务可见性。重点是区分过程边界、语句边界与事务边界。

第六单元把运行维护落到可核对的结果:字符与字节、校对规则、连接编码、账户来源、读取与写入权限验证、备份与独立恢复、日志用途、执行计划与索引选择。四行练习表能验证语法和逻辑,但不能用来宣称生产性能提升。

每一节怎样学才不流于复制 ​

  1. 先预测。 暂时遮住答案,写下应该返回几行、每行代表什么、关键金额是多少。
  2. 再执行。 在第一单元建立的练习库中运行一个完整实验,检查结果和错误信息。
  3. 改一个条件。 例如把右表日期从 ON 移到 WHERE,或把 COUNT(右表键) 改成 COUNT(*),解释结果为何改变。
  4. 核对状态。 写入实验结束后确认回滚;结构对象按本节说明删除,避免影响后续实验。
  5. 独立复写。 不看答案重写练习,并解释一个错误写法为什么不满足需求。

这套内容不是按「十分钟浏览完一篇」设计的。先完成一个小节、真正观察结果,再继续下一节,比把长页面一次看完更有意义。

实验基线与复现约定 ​

第一单元创建 showdocs_mysql_book,所有课程数据都是本站自建的虚构练习数据。表与结果的基线如下:

对象初始状态用途
learners3 位学员,2 个非 NULL 邮箱练习空值与零报名学员
courses4 门课程,价格依次为 39、79、49、59练习排序、计算、分类与零报名课程
enrollments3 条报名,涉及 2 位学员,收入 157.00练习次数、人次、金额与关系连接
未报名课程103、104对比 NOT EXISTS 和外连接
未报名学员3,周三验证报表是否保留零记录对象

读查询示例时,除非本节明确说明在事务中改了数据,结果都基于这组初始状态。写入示例主要通过 ROLLBACK 恢复;book_ 前缀的演示表、视图、过程和触发器在各节清理;全文索引和日期索引也有对应删除步骤。

下面的区别决定能否复现:

  • 同一个实验中的事务语句保持同一连接。 换连接会丢失会话变量、默认库和事务上下文。
  • 两会话实验必须真的建立两个连接。 第五单元会用 CONNECTION_ID 与明确的 A/B 步骤解释。
  • 标明预期失败的语句单独执行。 命令行批处理默认遇错停止,可能导致后面的观察与清理没有执行。
  • 结构变更不要夹进希望整体回滚的写入事务。 DDL 隐式提交正是第四单元的实验内容。
  • 实验账号与恢复库按第六单元单独创建。 课程查询无需管理员权限,账号管理与建对象则有额外权限要求。

每次出现与文中不同的结果,先确认版本、当前库、数据是否曾被修改、事务是否已结束,再排查 SQL。不要为追上答案直接关闭 SQL 模式、外键或约束,那可能掩盖了本来应该理解的问题。

本轮已在隔离的 MySQL 8.4.13 实例运行初始化与查询、写入示例,核对关键结果,并实际验证过程调用、空游标、触发器拒绝、保存点、语句失败后的事务状态、REPEATABLE READ / READ COMMITTED 双连接读取、只读账号和 mysqldump 恢复。实验完成后,三张基础表的行数、价格和收入均回到上述基线。安装界面、各操作系统的连接方式和生产数据规模下的性能不属于这次实验验证范围。

官方资源 ​

读完以后 ​

综合练习:从查询到验证闭环 ​

为课程运营人员制作一份十月报名报表,要求显示全部课程的编号、名称、报名次数、不同报名学员数、实收金额和平均每笔实付;没有报名的课程也必须出现,平均实付没有数据时显示 NULL。

先明确口径:当前复合主键限制一位学员对一门课只有一条报名,因此在「每门课」的粒度下,报名次数与不同学员数恰好相同;跨课程汇总后,它们就不再相同。

参考 SQL 与期望结果
sql
SELECT c.course_id, c.title,
       COUNT(e.learner_id) AS registrations,
       COUNT(DISTINCT e.learner_id) AS learners,
       COALESCE(SUM(e.paid), 0) AS revenue,
       AVG(e.paid) AS average_paid
FROM courses AS c
LEFT JOIN enrollments AS e
  ON e.course_id = c.course_id
 AND e.enrolled_at >= '2026-10-01'
 AND e.enrolled_at < '2026-11-01'
GROUP BY c.course_id, c.title
ORDER BY c.course_id;
课程报名次数不同学员数实收金额平均实付
101 · SQL 入门2278.0039.00
102 · MySQL 事务1179.0079.00
103 · Linux 入门000.00NULL
104 · SQL 报表000.00NULL

日期条件放在 ON 中,先限制允许匹配的报名,再保留所有左表课程。对右表非空键计数可避开补位行;SUM 在没有报名时转换为零,AVG 则保留 NULL。显示的小数位数可能随客户端格式不同,数值含义不变。

继续做三个变体:把日期范围改成 10 月 2 日以后,预测每课人数;在事务中给周三报名 104 后重新查报表,再回滚;将练习库备份到文件并恢复至独立库,确认报表回到上表。三个步骤分别检查过滤位置、事务可见性和恢复是否完整。

如果能独立完成,再继续学习本站的 SELECT 方法速查、子查询与 CTE和窗口函数。后两项是扩展学习,不代表本书有独立的 CTE 或窗口函数章节。

继续阅读