简介:一份面向本科阶段《MySQL数据库原理与应用》期末考试而整理的复习资料,完整涵盖数据库基础概念、SQL语句、表设计及性能优化等核心考点。资源以PDF格式呈现,共1个文件,压缩包大小约267KB,便于考前快速浏览打印,已有3768人学习。内容围绕选择与判断两类题型展开,逐题给出正确答案与简要解析:包括CREATE DATABASE建库、SUM/MAX等SQL函数、通配符%的使用、事务控制语句Begin Tran/Commit/RollBack、索引加速查询、主键选取、ORDER BY排序、DELETE/UPDATE/SELECT数据操作命令,以及MySQL作为关系型数据库管理系统与其他软件的区别等。通过这份材料,读者能在较短时间内梳理出MySQL课程的高频考点,熟悉常见出题方式,适合考前冲刺、知识巩固及备考自测。
1. MySQL期末复习资料怎么用才不白背:概念、SQL、原理三线并进
“背完了30页重点却照样写不对SQL”——这是我在给A同学做考前答疑时最常听到的一句话。名为《MySQL数据库原理与应用期末考试复习资料》的这类PDF,本身不是考点答案的堆砌,而是把数据库原理课里最容易被考的三块内容——关系模型与范式、SQL书写、索引与事务——压缩成一份可以反复过脑子的提纲。它的价值不在于让你“记住”,而在于让你在考场上短时间内把概念翻译成可执行的判断:给你一张ER图能拆成表,给你一组函数依赖能判范式,给你一个查询需求能写出不丢行的SQL。
这份资料适合正在备考期末的本科生,也适合想快速把数据库理论补回来自测的转行者。本文不重复粘贴资料里的概念原文,而是按这类复习材料最常见的覆盖范围,把每个考点的判断套路、SQL写法和坑位拆开讲。你不用逐页背,跟着章节把“怎么判断、怎么写、怎么答”过一遍,就能直接上考场。
2. 关系模型与范式设计:ER图转表、函数依赖和三范式的判断套路
期末卷子的第一道大题,十有八九是给一段业务描述,让你画ER图、转关系模式,再问“满足第几范式”。这块理论性强,但套路极其固定。复习资料里这部分给的定义很多,我看的时候只盯三样东西:实体和联系怎么判、函数依赖怎么找、范式怎么递推判断。把这三样钉死,设计题就拿下一半。
2.1 ER图转关系模式的落表规则:一对多、多对多怎么拆
先定实体。实体的判断标准很简单:业务描述里那些有独立属性、独立存在意义的名词,比如学生、课程、教师、班级。联系则是实体之间的动词关系,比如“选修”“授课”“属于”。注意一个高频干扰项:属性经常被误判成实体,比如“成绩”是选课联系的属性,不是独立实体。
转关系模式的规则按联系类型记:
- 1:1联系:可以把联系并入任意一端,在并入的那张表里加对方的主键作为外键;
- 1:N联系:把联系并入N端,在N端表里加1端的主键作为外键;
- M:N联系:必须单独建一张联系表,表中至少放两端的主键,两者联合做主键,若有额外属性(比如成绩)也放这张表。
这里有个常见的丢分点:M:N联系忘记单独建表,或者把联系表的主键设置成单列自增。标准做法是联合主键,除非题目明确要求代理主键。
下面用一个典型的选课场景演示建表语句,这也是复习资料里出现频率最高的案例类型。
-- 学生表:学号做主键 CREATE TABLE student ( sno CHAR(10) PRIMARY KEY, sname VARCHAR(20) NOT NULL, sdept VARCHAR(20) ); -- 课程表:课程号做主键 CREATE TABLE course ( cno CHAR(6) PRIMARY KEY, cname VARCHAR(40) NOT NULL, credit DECIMAL(3,1) ); -- 选课表:学生和课程是M:N联系,联合主键 CREATE TABLE sc ( sno CHAR(10), cno CHAR(6), grade DECIMAL(5,2), PRIMARY KEY (sno, cno), FOREIGN KEY (sno) REFERENCES student(sno), FOREIGN KEY (cno) REFERENCES course(cno) );逻辑说明:选课表就是典型的多对多联系表,联合主键 (sno, cno) 保证了同一学生对同一课程只有一条成绩记录。外键约束让数据库帮你维护参照完整性,删除或修改父表记录时,子表数据会按约束行为联动,期末设计题里这两个外键是必写的。
参数说明:CHAR(10) 用于学号这种定长编码,省空间且避免变长字段的碎片;VARCHAR 用于姓名这种长度不固定的文本;DECIMAL 用于成绩和学分,避免浮点误差。考试写表结构时,记住“定长编码用CHAR、变长文本用VARCHAR、金额成绩用DECIMAL”这条经验就能避免大多数类型错误。
2.2 函数依赖与范式判定:1NF、2NF、3NF、BCNF的判断题速成
范式题的本质是函数依赖题。先找出所有函数依赖,再按定义逐级判断,别跳步。
复习资料里常见的定义,我按判断题的答题习惯重新组织:
- 1NF:所有属性都是不可再分的原子值。表中不能出现“电话(手机+座机)”这种复合列;
- 2NF:在1NF基础上,消除部分函数依赖。每个非主属性必须完全依赖于主键,不能只依赖主键的一部分。联合主键的表最容易踩这个坑;
- 3NF:在2NF基础上,消除传递函数依赖。非主属性不能依赖于另一个非主属性;
- BCNF:每一个决定因素都包含候选码。判断口诀是“左部含码”,所有函数依赖的左边都必须含有某个候选码。
给一个具体例子:设计一张选课成绩表 sc(sno, sname, cno, grade, credit),主键 (sno, cno)。这里 sname 只依赖 sno,这就是部分函数依赖,所以它只满足1NF。要升2NF,就得把 sname 拆到学生表;拆完再看,credit 只依赖 cno,也是部分依赖,同样要拆到课程表。这就是2.1节里建三张表的原因——设计题让你“达到3NF”,最后落点基本全是这种拆分。
判断时建议三步走:第一步列全部候选码;第二步找非主属性;第三步逐个检查每个非主属性对候选码是完全依赖还是部分依赖、有没有传递依赖。把这三步写在草稿纸上,判断题就不会靠感觉蒙。
2.3 无损连接与保持依赖:分解结果怎么验证
“把 R(A,B,C,D) 分解为 R1(A,B) 和 R2(B,C,D),问是否无损连接”是必考的套路题。判断无损连接的通用方法是 Chase 算法,但考试里大多数情况用两条经验结论更快:
- 二路分解判断法:如果一个分解是二路的,且两个子模式的交集包含其中一个子模式的候选码,那么这个分解是无损连接的。原因在于,交集中的候选码可以作为连接后区分元组的依据;
- 多路分解判断法:按函数依赖逐个把属性“带”进已有子模式,直到没有新属性可带为止。能带出全部属性,就是无损连接。
保持依赖的判断更直观:把分解前所有函数依赖逐个检查,看它的每个属性是否能在某一个子模式内部得到验证。如果某个依赖的左边和右边被拆到了不同子模式里,那就丢失了。
这里必须强调一个考试高频点:无损连接和保持依赖是两个独立目标,能同时满足最好;某些情况下二者不可兼得,教材里的经典例子就是 R(A,B,C) 上有依赖 A→B, B→C,3NF分解后无损但不保持依赖。答题时先说明判断结果,再补一句“该分解满足/不满足无损连接、保持依赖”,这样能拿满过程分。
3. SQL必考题型拆解:建库建表、多表查询与分组统计的满分写法
SQL题在期末卷里通常占30到40分,而且是最容易靠短时间刷题涨分的部分。复习资料里的SQL章节一般按 DDL、DML、DQL、DCL 四块组织,我按考试真实出题顺序重新排:先能建对表,再能查对数据,最后能处理分组统计。每类题型都有固定的满分写法,照着写就不会在细节上丢分。
3.1 DDL和约束细节:主键、外键、唯一键、默认值一个都不能错
建表题失分往往不是不会,而是漏约束。考试判卷看的是“这份表结构能否防住脏数据”,所以每一个约束都有它的考法。
- PRIMARY KEY:一个表一个主键,注意联合主键的写法是表级约束;
- FOREIGN KEY:外键列的数据类型必须和引用列完全一致,否则建表直接报错;
- UNIQUE:学号、身份证号这种业务唯一但不当主键的列用唯一键;
- NOT NULL:业务上必须有值的列,比如姓名;
- DEFAULT:性别的默认值这类,用 DEFAULT 子句;
- CHECK:MySQL 8.0.16 之后才真正生效,老版本有语法但不校验,考试题如果没限定版本,写不写 CHECK 都不加分,别在这上面纠结。
ALTER TABLE 也是常客。加列、删约束、改类型的题,关键是记全语法骨架:
-- 给 sc 表加一个选课时间列 ALTER TABLE sc ADD COLUMN select_time DATETIME DEFAULT CURRENT_TIMESTAMP; -- 删除 sc 表上的外键约束(需要先知道约束名) ALTER TABLE sc DROP FOREIGN KEY sc_ibfk_1; -- 修改 student 表的 sname 列类型 ALTER TABLE student MODIFY COLUMN sname VARCHAR(30) NOT NULL;逻辑说明:ADD COLUMN 用 COLUMN 关键字更规范,部分 MySQL 版本省略也能过,但考试写法必须带。DROP FOREIGN KEY 后面跟的是约束名而不是列名,这是一个极高频的丢分点——复习资料里通常用小字注明了“外键约束名可查 information_schema”,但考场不可能让你查,所以建表时最好显式命名约束。
参数说明:DEFAULT CURRENT_TIMESTAMP 让数据库自动写入记录创建时间,这在业务设计和面试题里都常见。MODIFY COLUMN 是改列定义的完整写法,如果只改类型不动约束,要把原来的 NOT NULL 重新带上,否则会被数据库重置为允许 NULL,这既是考试易错点也是线上改表的血泪经验。
3.2 单表查询的WHERE→GROUP BY→HAVING执行顺序
单表查询最拉分的地方不是语法,而是执行顺序。很多同学写 GROUP BY 时在 SELECT 里放了不该放的列,就是因为没把执行顺序刻在脑子里。
MySQL 的SQL执行顺序是:FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT。这个顺序决定了两件事:WHERE 是在分组之前过滤原始行,HAVING 是在分组之后过滤聚合结果;SELECT 里能出现什么列,取决于 GROUP BY 之后的可用列。
-- 查询每门课选课人数超过2人的课程号和平均分,按平均分降序 SELECT cno, AVG(grade) AS avg_grade, COUNT(*) AS cnt FROM sc WHERE grade IS NOT NULL GROUP BY cno HAVING COUNT(*) > 2 ORDER BY avg_grade DESC;逻辑说明:先 WHERE——把成绩为空的记录先过滤掉,这样 COUNT() 数到的都是有成绩的选课记录;然后 GROUP BY cno——按课程分组;再 HAVING——保留选课人数大于2的组;最后 ORDER BY。这里的坑在于:WHERE 里不能用聚合函数,比如写成 WHERE COUNT() > 2 就是语法错误,因为执行到 WHERE 时还没分组,聚合根本没发生。
参数说明:AVG 和 COUNT 是期末考试最高频的两个聚合函数。COUNT(*) 计行数,COUNT(列名) 计该列非空值个数,两者在有空值时结果不同,判卷时经常用这个空值陷阱出题。avg_grade 是别名,ORDER BY 里可以引用别名,但 WHERE 里不行,这也是执行顺序的推论。
3.3 多表连接与子查询:IN、EXISTS、JOIN怎么等价改写
多表查询的三种写法——隐式连接、显式 JOIN、子查询——在期末卷里会换着花样出。核心考点是等价格式和对空值的处理。
-- 查询选修了“数据库原理”课程的学生姓名 -- 写法一:显式 JOIN SELECT DISTINCT s.sname FROM student s JOIN sc ON s.sno = sc.sno JOIN course c ON sc.cno = c.cno WHERE c.cname = '数据库原理'; -- 写法二:IN 子查询 SELECT sname FROM student WHERE sno IN ( SELECT sno FROM sc WHERE cno IN (SELECT cno FROM course WHERE cname = '数据库原理') ); -- 写法三:EXISTS 相关子查询 SELECT sname FROM student s WHERE EXISTS ( SELECT 1 FROM sc, course c WHERE sc.sno = s.sno AND sc.cno = c.cno AND c.cname = '数据库原理' );逻辑说明:三种写法结果等价,但考试判分时各有看重点。JOIN 写法要求能区分内连接和外连接,以及 DISTINCT 的去重作用。IN 子查询考察嵌套层次,IN 里还可以再嵌 IN。EXISTS 写法的关键在于它是相关子查询——内层查询引用了外层表的 s.sno,每遍历一个外层行都要执行一次内层查询;而 IN 是先把子查询结果集算出来再比对外层行。考试不考性能,但“等价改写”必须练熟,因为真题会让你把 IN 改写成 EXISTS,或者反过来。
这里有一个高频辨析:查询“没有选修某课的学生”时,NOT IN 遇到子查询结果里有 NULL 会直接返回空集,这是语法正确但逻辑错误的“温柔陷阱”。遇到 NOT IN 的题,优先用 NOT EXISTS 改写,这是考试里最经典的踩坑点之一。
4. 索引与事务原理:为什么原理题比SQL题更拉分
期末复习资料里,原理部分的每一页几乎都在讲索引和事务。原因是这部分选择题、填空题和简答题都能出,而且概念交错——B+树、聚簇索引、ACID、隔离级别、锁、MVCC——每个名词都能延伸出两三个变体题。SQL题蒙对语法还能拿一半分,原理题概念错就整题没分,所以这块的价值密度最高。
4.1 B+树索引结构:聚簇索引和非聚簇索引的区别
教材里讲B+树的那几页,考试问法就三种:为什么用B+树不用B树、聚簇索引和非聚簇索引的区别、什么时候索引失效。前两个是送分题,第三个是陷阱题。
B+树的答案是固定的:非叶子节点只存键值不存数据,一个节点能容纳更多键,树更矮,磁盘IO次数更少;所有数据都在叶子节点,并且叶子节点之间有链表连接,范围查询只需要顺着链表走,不需要像B树那样做中序遍历。答到这里就够拿分了。
聚簇索引和非聚簇索引的区别,用一句话守住核心:聚簇索引的叶子节点直接存整行数据,非聚簇索引的叶子节点存的是主键值。因此,InnoDB 表必须有一个聚簇索引,默认是主键;没有主键时,MySQL 会选第一个非空唯一索引,再没有就生成隐藏主键。常见做法是设计表时显式给出主键,别把决定权留给数据库。
查询用非聚簇索引时,先查到主键值,再回表去聚簇索引里取整行,这叫回表。如果查询的列恰好全在非聚簇索引的叶子节点里,就不需要回表,这叫覆盖索引,是优化的起手式。
索引失效的陷阱题,记住三个铁律:对索引列使用函数或运算,如 WHERE YEAR(create_time)=2024,索引失效;左模糊 LIKE '%abc' 索引失效;隐式类型转换导致索引失效,如手机号列是 VARCHAR 却用数字比较。考试时看到这三类条件,直接判断“不会走索引”。
4.2 事务ACID与隔离级别:脏读、不可重复读、幻读怎么区分
ACID四个性质,期末考得最多的是“隔离性是如何实现的”,答案是锁和MVCC。每个性质的定义要能默写,但隔离级别才是真正拉分的部分,因为四个级别对应三类异常,背混的人特别多。
- 读未提交 RU:会出现脏读、不可重复读、幻读;
- 读已提交 RC:解决脏读,但仍会出现不可重复读和幻读;
- 可重复读 RR:解决脏读和不可重复读,但幻读仍可能发生。注意:InnoDB 在默认RR级别下通过间隙锁基本消除了幻读,但SQL标准中RR仍定义为允许幻读,这个区别简答题必考;
- 串行化 SERIALIZABLE:三种异常全部解决。
区分三类异常,我的判断口诀是“脏读读未提交、不可重复读读已更新、幻读读新插入”:脏读是读到别的事务还没提交的数据;不可重复读是同一查询读到已提交更新的不同值;幻读是同一查询读到了别的并发事务新插入的行,行数变了。
考试简答题的完整答法是:InnoDB 默认隔离级别是 REPEATABLE READ,用 SELECT @@transaction_isolation; 可以查看当前会话的隔离级别。如果要证明理解,补一句“大多数OLTP系统用RC足够,RR依赖间隙锁保证可重复读,但会放大锁冲突”,这句能让你从背书上升到应用层。
4.3 锁机制与MVCC:当前读、快照读和间隙锁的配合
锁这块最容易答乱,我用一条主线理清:快照读和当前读是两套不同的读路径,MVCC 服务快照读,锁服务当前读和写。
快照读就是普通的 SELECT,它读的是事务开始瞬间或第一个快照的版本,不阻塞其他事务。当前读是 SELECT ... FOR UPDATE、SELECT ... LOCK IN SHARE MODE、UPDATE、DELETE,它必须拿到行锁才能执行,读的是最新已提交版本。
MVCC 的实现依赖两列隐藏字段和一个历史版本链。每行有 trx_id 最近修改事务ID和 roll_pointer 指向上一个版本,undo log 里保存历史版本,ReadView 决定当前事务能看到哪个版本。RC 级别每个快照读都生成新的 ReadView,RR 级别整个事务复用第一个 ReadView——这就是 RR 能保证可重复读的原因。
间隙锁是 InnoDB 在 RR 级别下为防幻读加的锁:当你在一个范围内查询不存在的记录时,InnoDB 会锁住这个范围间隙,阻止其他事务在这个间隙里插入新行。行锁加间隙锁组合成临键锁,这才是 RR 下能消除幻读的真实机制。答题时把“间隙锁锁的是范围不存在的记录”这句话讲清楚,简答题基本就是满分。
5. 复习中常见的四种翻车场景:现象、原因和解决办法
这部分是我带人复习时反复看到的真实翻车现场。每一条都按“现象 → 原因 → 解决”写清楚,考前对着自查,能少丢十几分。
5.1 现象一:GROUP BY 查询里出现未聚合的非分组列
现象:写 SELECT cno, sname, AVG(grade) FROM sc GROUP BY cno 时报错,或者老版本 MySQL 不报错但查出来的 sname 毫无意义。开卷笔试时,判卷老师直接按概念错误处理。
原因:执行顺序决定了 SELECT 阶段能看到的列。GROUP BY cno 之后,每个组内 sname 并不是唯一的,数据库不知道该取哪一个,这违反了“分组后只能查分组列和聚合列”的规则。
解决:要么把 sname 加进 GROUP BY,变成 GROUP BY cno, sname;要么用聚合函数处理,比如 MAX(sname) 或 GROUP_CONCAT(sname)。解题判断法:SELECT 里出现的每个非聚合列,都必须出现在 GROUP BY 里。
5.2 现象二:外键约束下数据删除顺序颠倒导致报错
现象:按 sc → course → student 的顺手顺序删数据,结果删 course 时报表存在外键约束无法删除,删了半天不知道原因。
原因:外键约束要求子表引用父表,删父表记录时子表还有引用数据,数据库拒绝执行。这是设计时最容易被忽略的顺序依赖。
解决:删除父表数据前先清空或删除子表引用数据,正确的删除顺序是先子后父。如果只是删表而不是删数据,用一条 DROP TABLE sc, course, student 按依赖顺序列出,或者临时 SET FOREIGN_KEY_CHECKS=0 关闭约束检查,删完再打开。考试问“为什么删除失败”,就答外键参照完整性约束。
5.3 现象三:隔离级别、锁机制概念张冠李戴
现象:简答题里写“可重复读解决了幻读”,或者“脏读是读到已提交的数据”,这类答案是整题零分。
原因:概念背混了,尤其把隔离级别解决的异常和锁机制两套知识混在一起。可重复读在SQL标准里解决的异常不包括幻读,准确的表述是“InnoDB 在可重复读级别下通过临键锁和MVCC在相当程度上消除了幻读,但SQL标准中RR仍定义为允许幻读”。脏读的对象是未提交的数据,写成已提交就是标准定义错误。
解决:用口诀固化记忆,“脏读读未提交、不可重复读读已更新、幻读读新插入”。答题时先写SQL标准的定义,再写InnoDB的实现,分两句话,既严谨又不容易被扣分。
5.4 现象四:范式判断题只看主键不看函数依赖
现象:给一张表问满足第几范式,直接看主键是单列就说“满足2NF”,完全不检查非主属性之间的传递依赖。
原因:范式判断的本质是函数依赖分析,主键只是起点。单列主键确实排除了部分依赖,但非主属性之间的传递依赖照样让表停留在2NF。
解决:按2.2节的三步走——列候选码、找非主属性、逐个检查完全依赖和传递依赖。比如学生表 student(sno, sname, sdept, dean) 主键是 sno,但 dean 依赖 sdept,sdept 依赖 sno,这就是传递依赖,最多只算2NF。考场上写“候选码是…非主属性是…存在传递依赖…所以是2NF”,过程分拿满。
6. 考前一天:用高频考点速查表和三道综合题收尾
考前最后一天不再适合从头翻资料,而是用速查表和综合题把知识过筛子。下表是我把期末考点压缩后的高频检查单,每一项都能在30秒内自答,答不出就翻对应章节。
| 考点 | 一句话判断 | 常见坑 |
|---|---|---|
| 1NF-3NF | 原子值→消部分依赖→消传递依赖 | 联合主键忘查部分依赖 |
| 无损连接 | 二路分解交集含候选码 | 只记结论不写判断过程 |
| GROUP BY | SELECT列必须在GROUP BY或聚合 | 聚合列和分组列混写 |
| HAVING vs WHERE | WHERE先过滤行,HAVING后过滤组 | WHERE里写聚合函数 |
| 聚簇索引 | 叶子存数据,非聚簇叶子存主键 | 把回表说成反查 |
| 三类异常 | 未提交/已更新/新插入 | 脏读写成读已提交 |
| 隔离级别 | RU→RC→RR→SERIALIZABLE | RR防幻读全靠间隙锁 |
| 外键删除 | 先删子表再删父表 | 顺序颠倒报约束错 |
自测不要只看选择题,拿三道综合题一次性覆盖三个维度。第一道:给出教师、课程、学生、选课的ER图,要求转关系模式并判断范式,练设计维度;第二道:写“查询选修了两门课以上的学生姓名”的SQL,练查询维度;第三道:简述RR隔离级别下如何防止幻读,练原理维度,把快照读、当前读、间隙锁、临键锁串起来答。这三道题能独立写完,期末这门课就稳了。
我自己的复习习惯是:考前把每一章的“一句话判断”抄在纸上,睡前过一遍,答不出就第二天早起翻那页。这个做法在几次备考里都救过我——原理题拉开差距的就是那些定义边界,而速查表恰好把边界都暴露出来了。希望帮到你。
本文还有配套的精品资源,点击获取