ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

数据库系统概论复习:SQL、事务与范式分解实战指南

数据库系统概论复习:SQL、事务与范式分解实战指南 简介面向数据库系统概论课程的期末备考者这份PDF整理了一套完整的期末试题与答案包含单选、填空、简答和设计题适合高校计算机及相关专业学生考前自测、查漏补缺也可用于二次重修或考研基础巩固。试题紧扣课程核心覆盖数据库系统核心、数据库管理系统职责、数据模型与独立性、E-R概念模型、关系数据模型与主码、关系代数运算、外连接查询、SQL建表与权限授予、数据库安全性、规范化插入异常、逻辑设计、事务隔离性、S锁/X锁、两段锁协议以及基于日志的数据库恢复等高频考点内容预览中还可见“列车运营”实体主码判定、R∩S等价表达式、GRANT授权语句等典型题目能让读者检验对关键概念的掌握程度并针对薄弱环节强化训练。资源包共1个PDF文件约421KB内容紧凑、便于打印使用目前已有287人学习浏览附带的参考答案便于快速核对是期末复习与日常练习的实用资源。1. 数据库系统概论复习的核心矛盾背书与技术题并存拿到《数据库系统概论复习期末试题及答案.pdf》第一反应是找答案背但这门课的复习方式恰恰相反试卷里的名词解释和简答占比通常不到三分之一剩下的是关系代数翻译、SQL 写结果、范式分解、事务恢复这类可以一步步推导的技术题。背会了不一定写得对写对了才说明真正理解。这篇博文按试卷的真实结构把关系模型与 SQL、事务与并发控制、规范化、复盘五个环节拆开每个环节都给出可执行的命令和检查表。无论你是在期末冲刺、补考重刷还是想借这门课补一轮数据库基础都能直接照着走。2. 关系模型与 SQL先解决“翻译题”再谈拿分2.1 关系代数到 SQL除法的三种标准写法期末卷里最大头的技术题是给你关系代数表达式写 SQL或者反过来。无论哪种核心都是把五种基本运算——选择 σ、投影 π、连接 ⋈、并 ∪、差 −——准确搬到 SQL 语法上。其中“连接”几乎必考但真正容易丢分的是除法运算。最经典的除法题是“查询选修了全部课程的学生”。直接除没有现成 SQL常规做法是转成“不存在一门课他没选过”用双重NOT EXISTS实现如果只用分组则要同时比较选课数和总课程数。两种写法都要会因为有的题目明确要求用关系代数有的则限定 SQL。下面按相同表结构给出两个标准答案-- student(sid, sname), course(cid, cname), sc(sid, cid) -- 写法一双重 NOT EXISTS对应关系代数除法 SELECT s.sid, s.sname FROM student s WHERE NOT EXISTS ( SELECT 1 FROM course c WHERE NOT EXISTS ( SELECT 1 FROM sc WHERE sc.sid s.sid AND sc.cid c.cid ) ); -- 写法二分组计数对比总课程数 SELECT sc.sid FROM sc GROUP BY sc.sid HAVING COUNT(DISTINCT sc.cid) (SELECT COUNT(*) FROM course);写法一的外层NOT EXISTS对应“不存在”内层对应“他没选过的课程”两层否定叠加成“选了全部课程”。写法二是用HAVING把每个学生的选课数量与总课程数比较逻辑更直接但要求sc表中同一学生同一课程不重复。考试时如果题目没有声明(sid, cid)唯一必须写COUNT(DISTINCT cid)否则会因重复选课记录而多算。另有一个高频坑NOT IN子查询结果含NULL时整句返回空集所以“没选任何课的学生”这类题建议直接用LEFT JOIN ... WHERE sc.sid IS NULL或NOT EXISTS写法避免教科书答案里NOT IN的隐性踩坑。2.2 分组统计与 HAVING期末 SQL 题的高频扣分点分组统计题几乎每卷一道常见考点是统计每门课的选课人数、各班平均分、筛选超过平均分的课程。写法上有一个硬规则WHERE在分组前过滤行HAVING在分组后过滤组SELECT里的非聚合列要么出现在GROUP BY中要么被聚合函数包裹否则多数数据库直接报错而不是给空结果。考试扣分也多半是没分清这两层过滤时机。-- 查询平均分高于全体平均分的课程及其平均分 SELECT cid, AVG(score) AS avg_score FROM sc GROUP BY cid HAVING AVG(score) (SELECT AVG(score) FROM sc) ORDER BY avg_score DESC;这段代码的执行顺序是先按cid分组再对每个组算AVG(score)HAVING用子查询得出的全体平均分过滤掉低分组最后排序。注意WHERE不能出现在这里因为AVG(score)是分组后产生的聚合值WHERE在分组前执行根本看不到它。如果题目改成“只看成绩大于 60 分的记录再统计”才需要把WHERE score 60放在GROUP BY之前。复习时建议把这种“同结构对比题”成对练习几乎能覆盖所有分组考点。2.3 EXPLAIN把 SQL 题变成可验证的排错题上机验证是最好的查错手段。在 MySQL 8.0 中给 SQL 前加EXPLAIN就能看到执行计划EXPLAIN SELECT s.sname, c.cname, sc.score FROM sc JOIN student s ON sc.sid s.sid JOIN course c ON sc.cid c.cid WHERE sc.score 90;重点看三列type是否出现const、ref、rangekey是否实际用到索引rows是估算扫描行数。如果看到ALL全表扫描说明连接条件或过滤条件没走索引优先检查ON子句里的列是否有索引、条件能否写成前缀匹配。试卷不会直接考EXPLAIN但平时拿它跑课后题能很快发现“为什么答案和我写的不一样”通常不是语法错而是连接方向或过滤条件写反了。数据库系统概论第六版教材配套的课后 SQL 题量不算少按这种“先写后查”的方式过一遍比只对答案有效得多。3. 事务与并发控制数据库系统概论的必考重灾区3.1 ACID 与隔离级别的实验对照事务与并发控制是概念密度最高的一章简答题和综合题同时出现。最容易丢分的不是 ACID 背不出来而是没把隔离级别、锁、日志三套机制对应到具体场景。先用一个实验把隔离级别变成可观察的行为-- 查看当前隔离级别MySQL 8.0 SELECT transaction_isolation; -- 会话A设置为读已提交观察不可重复读 SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED; BEGIN; SELECT balance FROM account WHERE id 1; -- 此时在会话B执行 UPDATE account SET balance 500 WHERE id 1; COMMIT; -- 会话A再次执行同一SELECT结果从原来的值变成500 COMMIT;在READ COMMITTED下同一事务内两条相同SELECT可能读到不同结果这就是不可重复读。把隔离级别换成REPEATABLE READ再跑一遍第二次查询结果不变原因是 InnoDB 的快照读在事务第一次读取时生成快照后续读都基于该快照。MySQL 的REPEATABLE READ在快照读下还能基本消除幻读但这依赖间隙锁标准 SQL 定义与 MySQL 的实际表现有差异考试以教材表述为准面试可以补充 MVCC 这一层。四种隔离级别与异常现象的对应关系是简答和选择的常客隔离级别脏读不可重复读幻读READ UNCOMMITTED可能可能可能READ COMMITTED消除可能可能REPEATABLE READ消除消除标准SQL下可能MySQL快照读下消除SERIALIZABLE消除消除消除3.2 封锁协议一级到三级分别解决什么封锁协议常以简答题出现答题时要把“锁类型、加锁时机、释放时机”三要素写全缺一个都会扣分。三者的递进关系很清晰一级协议只要求修改前加 X 锁并保持到事务结束解决丢失更新二级协议在一级基础上要求读后立即释放 S 锁额外解决脏读三级协议要求读前加 S 锁并保持到事务结束进一步解决不可重复读。封锁协议X锁释放S锁释放解决的问题一级事务结束不需要丢失更新二级事务结束读后立即释放丢失更新、脏读三级事务结束事务结束丢失更新、脏读、不可重复读这里考试还容易混另一个概念两段锁协议与三级封锁协议不是一回事。两段锁要求事务分成扩展阶段和收缩阶段一个锁释放后不能再申请新锁它解决的是可串行化调度三级封锁协议解决的是异常现象。回答“如何保证并发调度可串行化”时写两段锁回答“如何防止脏读”时写二级封锁协议不要答串。3.3 日志恢复与检查点的答题模板故障恢复题的答题套路比想象中固定。核心是 WAL 原则日志先落盘数据页后落盘。恢复时正向扫描日志对已提交事务做 REDO反向扫描对未提交事务做 UNDO。检查点的作用是缩短扫描起点不需要重放整个日志。实际系统里可以这样观察 WAL 机制# 以 PostgreSQL 为例观察 WAL 目录与相关参数 ls -lh /var/lib/postgresql/16/main/pg_wal/ | tail -20 grep -E wal_level|full_page_writes /var/lib/postgresql/16/main/postgresql.confpg_wal目录下的文件就是预写日志wal_level决定记录多少日志信息full_page_writes防止页断裂这些参数体现的就是“先写日志”这一基本原则。回答“系统在 T3 时刻崩溃如何恢复”类的题目时按三步写先从最后一个检查点 LSN 开始正向扫描日志然后对状态为 COMMIT 的事务执行 REDO最后对没有 COMMIT 的事务反向执行 UNDO。不必把每条日志都列出来写清楚扫描起点和两类事务的集合即可得分。4. 数据库设计与规范化范式分解动手练4.1 从函数依赖推导候选码规范化大题通常是演算量最大的部分套路也最固定。先看求候选码。基本原则是只在函数依赖右侧出现的属性一定不属于候选码只在左侧出现或两边都不出现的属性一定属于每个候选码。从这些必然属性出发求闭包若能覆盖全部属性就是唯一候选码否则把剩余属性逐个加入再求闭包。给定 R(A,B,C,D,E)F {A→BC, C→D, B→E} 只在右侧出现D、E 只在左侧出现A、B 求 A 的闭包 A→BC 得到 A,B,C B→E 得到 E C→D 得到 D A {A,B,C,D,E}覆盖全属性 候选码A唯一这段推导的关键是“闭包覆盖全属性”这一步。如果题目换成F {A→B, C→D}则 A 的闭包只有{A,B}必须把 C 加入尝试AC的闭包。多数考试题一步闭包就能出结果少数需要试两个组合。建议把所有依赖在草稿纸上列成箭头图先删掉只在右侧的属性能大幅降低漏算概率。4.2 2NF 到 BCNF 的判定与分解流程判定范式先分清主属性和非主属性出现在候选码里的属性是主属性其余是非主属性。非主属性对码的部分依赖存在就不是 2NF非主属性对码的传递依赖存在就不是 3NF主属性对码的部分依赖或传递依赖存在就不是 BCNF。实际做题时按“先判 2NF再判 3NF最后看主属性”的顺序不容易漏。继续用 4.1 的例子候选码是 A没有非主属性对码的部分依赖所以满足 2NF但 D 对 A 存在传递依赖 A→C→D所以不满足 3NF该关系属于 2NF。分解到 3NF 的常规流程是合并同左部依赖逐个拆出关系模式Step1 求最小函数依赖集A→B, A→C, C→D, B→E Step2 合并同左部A→BC 合并为一项 Step3 按依赖生成模式 R1(A,B,C) R2(C,D) R3(B,E) Step4 检查是否包含候选码R1 包含 A无需补充这个分解保持了全部函数依赖A→B 和 A→C 在 R1 中C→D 在 R2 中B→E 在 R3 中。注意“保持依赖”和“无损连接”不是一回事期末卷常在同一道题里分成两问一问考分解是否保持依赖另一问考是否无损。分解到 3NF 的合成算法能保证保持函数依赖但不保证无损所以下一步必须验证。4.3 无损连接验证表格法速查二元分解有快速判断法两个模式的交集包含其中一个模式的候选码时分解就是无损的。多于两个模式时用表格法第 i 行对应第 i 个分解模式第 j 列对应第 j 个属性包含该属性填 a_j否则填 b_ij反复用函数依赖把能匹配的符号改成相等某行全部变成 a 就停止说明无损。以刚才的R1(A,B,C), R2(C,D), R3(B,E)为例初始表里 R1 覆盖 A、B、CR2 覆盖 C、DR3 覆盖 B、E。先用 A→B 和 A→C 无法直接匹配因为 A 列只有 R1 有 a再用 C→DR1 和 R2 的 C 列一致能把 R2 的 D 更新为与 R1 相同继续用 B→ER1 和 R3 的 B 列一致把 R3 的 E 更新。最后某行全部变为 a 值说明分解无损。表格法不需要一次推完出现全 a 行即可收手考试时把每次应用哪个函数依赖写在旁边方便检查。5. 试卷复盘把错题变成参数记忆5.1 试卷结构与复习顺序期末卷的题型分布大致如下具体分值以本校卷面为准。题型常考内容对应复习动作单选题三级模式、数据模型、事务特性默写一遍概念对照表简答题两段锁、日志恢复、规范化步骤按三要素背框架SQL 与关系代数连接、除法、分组统计上机跑通三类题设计题ER 图转关系模式、范式分解、事务场景用固定模板练三道复习顺序建议是先做 SQL 上机再做范式推导最后背简答框架。SQL 和范式属于练了就有分的部分放到前面能建立信心简答题背太早容易忘考前突击效率更高。ER 图转关系模式本质是映射规则实体转表、1:n 关系把主键下放到 n 端、m:n 关系单独建表。把这套规则套进三道典型题设计题基本不会丢大分。5.2 三类高频错题的反向记忆法复盘错题时不要停留在“看答案”把每道错题改造成一个参数问题错的是隔离级别就打开 MySQL 改TRANSACTION ISOLATION LEVEL重新观察现象错的是 GROUP BY就改写WHERE和HAVING验证过滤顺序错的是范式判定就换一组函数依赖重新求候选码、重新分解。用题目驱动参数记忆比对着答案背诵有效得多。错题现象 → 对应参数或函数 → 改一个条件重跑 → 写下现象差异比如“读已提交下两次查询结果不同”对应READ COMMITTED的不可重复读把参数换成REPEATABLE READ再执行同一段事务代码两条查询结果一致这个差异就记住了。再比如“分组统计多了一行错误数据”多半是HAVING位置写错或忘了DISTINCT把题目中的重复数据删掉重跑一次过滤语义比背概念更直观。把做过的错题按“现象—参数—重实验”整理成三列每道题花五分钟做完这个动作比再刷三套题更值得。试卷可以千变万化考点和命令永远是那一组。本文还有配套的精品资源点击获取
返回列表