简介这份资源是钱学忠《数据库原理及技术》教材的配套习题答案面向正在学习数据库课程的高校学生、备考人员及自学者用于对照练习、巩固课堂所学并解决做题中的疑难。内容围绕数据库设计、SQL语言、关系数据库理论、数据库管理系统与数据库管理等核心章节展开可配合教材逐章核对答案、梳理E-R模型转换、关系代数与范式规范化等易错知识点。资源以rar压缩包形式提供包内文件总数暂未明确整体约16.69MB体积轻便便于本地保存与随时查阅。目前已有693人学习下载具备一定的使用参考基础。对于需要课后自测、理清习题思路、补齐概念短板的读者这份答案资料能提供直接的对照依据帮助在练习中加深对数据库设计与管理的理解。1. 数据库原理复习地图从关系模型到事务与恢复的整体骨架数据库原理这门课最坑的地方在于它不像编程课那样“跑通就算会”。很多人把 SQL 写得飞起一到范式分解、并发调度、日志恢复就翻车因为这些内容考的是“为什么这样设计”而不是“怎么写语句”。整门课其实是一张三层地图底层是关系模型与关系代数中间层是 SQL 与模式设计范式、依赖上层是事务、并发控制与恢复。三层之间靠“数据一致性”这条线串起来——范式解决静态冗余事务解决动态并发恢复解决故障兜底。复习时先认清这张地图再逐层填细节比从头背到尾高效得多。这份梳理适合正在系统学数据库、或者临考想快速查漏补缺的人拿来就能对着目录自测。2. 关系模型与关系代数一切查询的数学底座2.1 关系模型的三要素与完整性约束关系模型看起来简单无非“表、行、列”但考试和实际设计里最容易含糊的恰恰是它的形式化定义。一个关系对应一张二维表元组是行属性是列域是属性的取值范围。真正要记牢的是三类完整性约束实体完整性要求主键非空且唯一参照完整性要求外键要么为空、要么引用存在的元组用户定义完整性则是具体业务规则比如年龄必须在 0 到 150 之间。这三条不是背诵条目而是后面范式、SQL 约束、事务隔离的共同前提。梳理下来会发现很多判断题的陷阱就藏在这里主键能不能为空外键能不能指向本表级联删除属于哪类完整性答案都回到定义本身。复习时建议把每个约束配一个反例比如“学生表主键为空”违反实体完整性“选课表引用不存在的课程号”违反参照完整性这样比干背定义稳。2.2 关系代数五种基本运算与推导运算关系代数是 SQL 的理论内核考试常考“用关系代数表达查询”。五种基本运算是选择、投影、并、差、笛卡尔积其余的交、连接、除法都可以由基本运算推导出来。重点在于理解每个运算对“行”还是对“列”起作用选择筛行投影筛列并和差要求属性结构相容笛卡尔积做组合。运算作用对象关键条件常见考法选择 σ行谓词条件写出满足条件的元组投影 π列去掉重复元组注意投影后自动去重并 ∪行属性数、域相同集合语义差 −行属性结构相容“不属于”类查询笛卡尔积 ×行列组合无连接的基础最容易忽略的是投影会自动消除重复元组这一点和 SQL 的 SELECT 默认不去重正好相反是血泪经验级的易错点。连接运算本质是笛卡尔积加选择自然连接再去掉重复属性列理解这条推导链写复杂查询时就不会乱。2.3 从关系代数到 SQL 的映射思路把关系代数翻译成 SQL核心是“选择变 WHERE、投影变 SELECT 列表、连接变 JOIN、差变 NOT EXISTS 或 EXCEPT”。比如“查询选修了全部课程的学生”关系代数用除法表达SQL 里通常转成“不存在一门课该生没选”的双重 NOT EXISTS。这种“全部”类查询是重点也是难点死记模板没用要理解“双重否定”的转换逻辑。-- 查询选修了全部课程的学生号双重 NOT EXISTS 表达除法 SELECT S.sno FROM Student S WHERE NOT EXISTS ( -- 不存在这样一门课 SELECT * FROM Course C WHERE NOT EXISTS ( -- 该生没有选它 SELECT * FROM SC WHERE SC.sno S.sno AND SC.cno C.cno ) );这段代码的逻辑是外层对每个学生检查“是否存在一门课他没选”若不存在说明他选了全部课。参数上 S.sno 是学生号SC 是选课表C.cno 是课程号。写这类题时先在纸上画关系代数表达式再逐层套 NOT EXISTS比直接硬写 SQL 稳得多。3. 范式与函数依赖模式设计的静态一致性3.1 函数依赖、候选键与属性闭包范式一章的入口是函数依赖。X→Y 表示 X 决定 Y即 X 相同则 Y 必相同。由此引出候选键能决定全部属性且极小的属性集。求候选键的实用方法是属性闭包——从给定属性集出发反复用函数依赖扩充直到不再增长若闭包含全部属性则是超键再检查极小性。属性闭包的计算是必考操作也是最容易算错的地方。建议按“初始化→逐条扫描依赖→合并→再扫描”的循环来别跳步。比如已知 A→B、B→C求 A 的闭包先得 A用 A→B 得 B再用 B→C 得 C闭包为 ABC。这类题错在漏扫依赖或提前停手多练几遍形成肌肉记忆就好。3.2 1NF 到 BCNF 的判定与分解范式是层层加码的1NF 要求属性原子2NF 消除非主属性对候选键的部分依赖3NF 再消除传递依赖BCNF 要求每个决定因素都是候选键。判定时先找候选键再逐条检查函数依赖的左部是否超键。范式消除的问题判定要点分解代价1NF属性非原子每列不可再分无2NF部分依赖非主属性完全依赖候选键可能增连接3NF传递依赖非主属性不传递依赖保持依赖BCNF主属性部分/传递依赖左部均为候选键可能丢依赖重点难点在于 3NF 与 BCNF 的取舍3NF 分解能保持函数依赖BCNF 分解可能丢失依赖但消除更多冗余。考试常问“是否保持无损连接和依赖”要分清无损连接看分解后自然连接能否还原保持依赖看原依赖能否由分解后的依赖推出。这两个概念混着考是翻车高发区。3.3 无损连接与保持依赖的判定无损连接判定有个表格法Chase 算法保持依赖则逐条检查原依赖是否被分解后的依赖集逻辑蕴含。实操中更常用的是定理两个子模式分解若公共属性是其中一个的候选键则无损。多子模式则用 Chase 表逐步填符号。这部分抽象建议配一个小例子手推一遍R(A,B,C)依赖 A→B、B→C分解为 R1(A,B)、R2(B,C)公共属性 B 是 R2 的候选键故无损。保持依赖则看 A→B 在 R1 中、B→C 在 R2 中均保留。推一遍比看十遍定义管用。4. 事务、并发控制与恢复动态一致性的三道防线4.1 事务 ACID 与隔离级别事务是数据库动态一致性的基本单位ACID 四个特性要能各举一例说明。原子性靠日志回滚一致性靠约束与业务逻辑隔离性靠并发控制持久性靠日志落盘。隔离级别从低到高是读未提交、读已提交、可重复读、串行化级别越高并发越差。隔离级别脏读不可重复读幻读读未提交可能可能可能读已提交避免可能可能可重复读避免避免可能串行化避免避免避免这张表几乎必考但别只背表要理解每种异常的定义脏读读到未提交数据不可重复读同一行两次值不同幻读同一条件两次行数不同。理解定义后表自然推得出来。4.2 并发调度的可串行化与两段锁并发控制的核心问题是“什么样的调度是正确的”答案是可串行化——调度结果等价于某个串行执行。判定用冲突可串行化画优先图无环则可串行化。两段锁协议2PL是保证可串行化的常用手段分加锁段和解锁段一旦解锁不能再加锁。重点难点是 2PL 与可串行化的关系遵守 2PL 一定可串行化但可串行化不一定遵守 2PL。还有严格 2PL 要求事务结束才释放锁能避免级联回滚。考试常给一个调度让你判断是否可串行化、是否死锁画优先图是标准解法别凭感觉。4.3 日志、检查点与故障恢复恢复子系统靠日志实现原子性和持久性。Undo 日志记录旧值用于回滚Redo 日志记录新值用于重做。检查点机制定期把内存数据刷盘并记录活跃事务缩短恢复时的扫描范围。恢复时从最近检查点开始对已提交事务 Redo对未提交事务 Undo。这里最容易漏的是“检查点时刻活跃事务列表”的作用——它决定了哪些事务需要回滚。还有 WAL 原则先写日志再写数据否则崩溃后无法恢复。这些原则性内容比背流程更重要理解了 WAL恢复流程自然顺。5. 易错点排查数据库原理里最容易翻车的五处5.1 易错点一投影去重与 SQL 不去重混淆易漏点关系代数投影自动去重SQL 的 SELECT 默认保留重复。为什么漏两套体系分开学没对照。怎么补每写一个投影表达式旁边标注“SQL 需加 DISTINCT 才等价”形成条件反射。5.2 易错点二3NF 与 BCNF 分解目标搞反易漏点以为 BCNF 一定优于 3NF。为什么漏只记“BCNF 更强”忽略保持依赖的代价。怎么补记住 3NF 可同时做到无损连接和保持依赖BCNF 可能丢依赖设计题按题目要求选目标。5.3 易错点三可串行化判定凭直觉易漏点看到调度“看起来对”就判可串行化。为什么漏没画优先图。怎么补凡涉及并发调度强制画冲突优先图有环即不可串行化这是唯一可靠判据。5.4 易错点四隔离级别与异常对应记串易漏点把“可重复读避免幻读”记成正确。为什么漏表格背混。怎么补用定义推——幻读是行数变化可重复读只锁已读行防不住插入故仍可能幻读。5.5 易错点五恢复时 Redo 与 Undo 对象弄反易漏点对已提交事务做 Undo。为什么漏没理解 WAL 与提交点。怎么补记死“已提交 Redo、未提交 Undo”配合检查点活跃事务列表判断别凭印象。6. 复习清单与查漏补缺一套可执行的考前自测流程复习到后期最怕的是“感觉都会、一考就错”。我的做法是把整门课压成一张自测清单按模块逐项打勾错一项就回对应章节补。下面这张表可以直接抄去用每项后面留空写“掌握/模糊/不会”三轮下来薄弱点一目了然。模块自测项判定标准关系模型三类完整性各举反例能脱口而出关系代数五种基本运算手写表达式不看书画出SQL 映射双重 NOT EXISTS 写“全部”查询独立写出函数依赖求属性闭包与候选键三步内算对范式判定并分解到 3NF/BCNF说明无损与保依赖事务ACID 各配一例例子贴切并发画优先图判可串行化无环有环说清恢复检查点后 Redo/Undo 对象不弄反具体执行分三步。第一步合上书按清单逐项自问答不出的标红这一步只暴露问题不解决。第二步对每个红项回到对应小节用本文的表格和代码重推一遍尤其是闭包、优先图、双重 NOT EXISTS 这三类动手题必须手写。第三步隔一天再测红项连续两轮通过才算过关。# 自测节奏参考三轮间隔递减模拟遗忘曲线 第1轮考前7天全清单过一遍标红 第2轮考前3天只测红项手写推导 第3轮考前1天红项复测 易错点五条默写这个节奏的关键是“只测红项”别每轮从头刷时间根本不够。参数上间隔按自己的遗忘速度调但三轮别省。最容易忽略的是易错点那五条要单独默写因为它们往往不是“不会”而是“记混”默写能逼出混淆点。我自己的教训是第一次考这门课范式分解和并发调度都自认为懂了结果优先图画反、BCNF 分解丢了依赖两道大题直接崩。从那以后我每次复习这类“判定型”知识都强制走一遍“手写推导 反例验证”不靠眼睛看。希望这份清单帮到你少走我走过的弯路。本文还有配套的精品资源点击获取