
简介面向数据库课程学习者与备考者的系统复习资料整理数据库系统概论各章核心考点与试题覆盖数据管理技术发展、概念模型、数据库特点、三级模式两级映射、完整性约束、安全性控制、事务与并发控制等关键内容。资料以复习试题与参考答案形式呈现包含选择题、填空题、简答题等常见题型能帮助读者快速回顾理论知识并检验掌握程度。资源包内含1个PDF文件大小约1.08MB排版紧凑、便于打印或电子阅读适合期末备考、专升本或考研复习阶段使用。已有360人学习配套试题解析可有效提升答题速度与准确性尤其适合在完成教材通读后用于自测与强化训练。1. 数据库系统概论的复习试题值得花时间做两遍吗又到了期末周左手是五六百页的《数据库系统概论》教材右手是老师划的重点很多人的复习方式就是把书从头翻到尾翻到第七章就忘了第一章讲的是什么。这也就是为什么手里有这份《(完整版)数据库系统概论各章复习试题及答案.pdf》的人往往比只闷头啃课本的人更容易过——不是因为有答案可以抄而是题目逼着你把“懂概念”变成“做对题”这个转变只能靠做题完成。《数据库系统概论》最常见的教学版本是王珊、萨师煊主编的教材第六版已经在不少学校投入使用。内容从数据库基本概念、关系模型、SQL语言一直讲到数据库设计、事务管理、并发控制和恢复技术跨度很大。这类各章复习试题通常按教材章节编排每章涉及选择题、填空题、简答题和操作题答案要么放在章末要么统一附在文末。适合三类人期末考前突击的在读学生、考研专业课需要系统理一遍数据库理论的考生以及工作中天天和表结构、SQL打交道但理论底子不牢的工程师。这份资料真正值得做的不是“把答案读一遍”而是把它当成自测工具使用先做题、再对答案、最后回到教材补漏。下面按“知识地图 → 题型打法 → 易错排查 → 自我检验”的顺序给出一套能直接复制的复习流程。2. 按章节拆知识地图四大板块才是复习题的主干各章复习题的数量和题型看起来五花八门但考点骨架翻来覆去就是四大块数据模型与关系模型、SQL与关系代数、数据库设计、事务与恢复。复习时先在心里画这张地图拿到任何一道题先判断它属于哪个板块再决定调用哪套解题方法效率会高很多。2.1 数据模型与关系模型概念题的高发区这一板块通常对应教材的前两三章也是选择题、填空题的主要来源。先把数据模型的层次理清教材里说的“数据模型”其实分两类一类是概念模型比如ER模型用来描述现实世界的对象和联系另一类是逻辑模型包括层次模型、网状模型、关系模型和面向对象模型。复习题里常给一句话问“这属于哪种模型”判断核心只有一个关系模型用二维表表示实体和联系层次模型是树状结构网状模型是图状结构看到“二维表”就往关系模型上靠。关系模型的核心概念是“关系”。一张表叫关系一行叫元组一列叫属性属性的取值范围叫域。这些术语在填空题里反复出现比如“关系中属性的取值范围称为该属性的____”不少人顺手填“值域”或“类型”结果判错就是被相近概念带偏了。码的概念是这一节的分水岭。候选码能唯一标识元组的最少属性组、主码从候选码里挑一个、外码本表里引用另一张表主码的属性、全码所有属性组共同作为候选码。做题时默念三步先找候选码再用闭包算法验证最后看外码。复习题里“找出关系模式的候选码”几乎必考漏候选码是高频失分点。比如关系R(A,B,C,D)函数依赖集F{AB→C, D→B}候选码是ABD而不是AB因为只靠AB推不出D这是最典型的“少推一个”的坑。关系完整性建议做成表格对照记忆题目只要涉及“能不能为空”“能不能引用已删除记录”都逃不出这张表完整性约束对象核心规则典型违例实体完整性主码主码取值非空且唯一插入重复主码记录参照完整性外码外码为空或等于被参照表主码插入不存在的学生编号用户定义完整性具体列按业务自定义约束年龄填负数复习题经常把“NOT NULL”归入实体完整性来误导人千万别上当NOT NULL属于用户定义完整性实体完整性只针对主码。2.2 SQL语言与关系代数从会写语句到写对语句关系代数章节通常和SQL章节合并考察。关系代数是SQL的理论基础考试常让“先写关系代数表达式再写SQL语句”两套语言都要熟练。关系代数最核心的是五种基本运算选择(σ)、投影(π)、并(∪)、差(−)、笛卡尔积(×)。其它运算比如连接、交、除都是这五种的组合。光记名字不难翻车点全在细节选择是行过滤投影是列裁剪且结果自动去重自然连接会按同名属性自动等值连接两张表有多个同名列时结果很可能不是想要的。除运算是个经典难点。题目通常写成“查询选修了全部课程的学生学号”不要试图直接“除”正确做法是把问题转化成逻辑表达式不存在一门课程该学生没有选。SQL里就是NOT EXISTS嵌套后面第3章会给出完整代码。关系代数则用除法直接表达但很多教材在“除”上只给定义不给练习导致学生看到题目就懵。SQL执行顺序也常被题目设坑。一条SELECT语句的逻辑执行顺序是FROM取表WHERE过滤行GROUP BY分组HAVING过滤组SELECT投影并计算ORDER BY排序最后才是LIMIT分页。比如“统计每个系学生数只要人数大于100的系”HAVING必须写在GROUP BY之后、ORDER BY之前而不是用WHERE——WHERE在分组前执行根本访问不到统计结果。我复习时愿意把关系代数当SQL的草稿纸先写代数表达式检查连接和选择条件再翻译成SQL。对初学者来说这比直接写SQL更容易定位错误也方便自己对答案。2.3 数据库设计ER图与范式是拿分大头这一板块对应数据库设计章节重点几乎固定ER图设计和关系模式的规范化。数据库设计的六个阶段要背下来需求分析、概念结构设计、逻辑结构设计、物理结构设计、数据库实施、数据库运行和维护。选择题里“概念结构设计阶段的主要工具是什么”答案是ER模型“逻辑结构设计阶段的主要成果是什么”答案是关系模式。六个阶段各有各的产物混着考是常规操作。ER图转关系模式的规则很死板具体转换表放在第3章详细展开这里先重点说范式。范式判断题我的做法是四步第一步写出全部函数依赖别漏题干里的隐含依赖第二步用闭包算法求所有候选码第三步找出所有非主属性第四步依次检查2NF、3NF、BCNF检查点分别是是否存在非主属性对候选码的部分依赖、是否存在非主属性对候选码的传递依赖、每个决定因素是否都包含某个候选码。给一个经典例子R(A,B,C,D)F{AB→C, C→D, D→B}。先求候选码AB的闭包是{A,B,C,D}AC的闭包也是{A,B,C,D}所以候选码是AB和AC。所有属性都在候选码里没有非主属性因此部分依赖和传递依赖不可能存在R至少属于3NF。但C→D中C不包含候选码决定因素不是超码不满足BCNF所以R属于3NF。这个例子几乎是各章复习题的常客把过程练熟范式题就稳了。很多新手记不住“BCNF要求每个决定因素都包含候选码”做题时只拿“非主属性对码的传递依赖”去套结果把所有题都误判成3NF。注意BCNF管的是所有属性包括主属性3NF只管非主属性这个边界就是得分和失分的分界线。2.4 事务、并发控制与恢复最硬核也最值钱这一板块对应事务、并发控制、数据库恢复三章概念密度高综合题也最爱从这出。事务的四个特性别只背词要能对应到具体现象原子性一个事务要么全部执行要么全部不执行执行到一半断电就是典型的原子性破坏一致性事务执行前后数据库完整性约束不被破坏隔离性并发事务互不可见中间状态持久性事务一旦提交结果不丢失。复习题问“某个故障场景体现了哪个特性失效”本质就是在考这四个特性的边界。并发控制要理清三类不一致问题丢失修改、不可重复读、读脏数据。两个事务同时改同一数据后提交覆盖先提交是丢失修改一个事务读同一数据两次中间被另一个事务修改两次结果不同是不可重复读一个事务读了另一个事务回滚前未提交的数据是读脏数据。做题时先判调度再写结论别跳步。封锁协议也是高频考点三级封锁协议的对应关系必须锁死一级协议事务修改前加X锁直到事务结束能防丢失修改二级协议在一级基础上读前加S锁、读完即释放进一步防读脏数据三级协议在一级基础上读前加S锁、事务结束才释放进一步防不可重复读。注意“读完释放”和“事务结束才释放”的区别这直接决定能不能挡住不可重复读。两段锁协议2PL保证调度的可串行化规定所有加锁操作位于所有解锁操作之前分扩展阶段和收缩阶段别和三级封锁协议混为一谈——前者是并发调度的性质后者是具体加锁策略。故障恢复一章最常考日志顺序核心结论是“先写日志再写数据库”。为什么如果先写数据库后写日志数据已落盘但日志没记崩溃后既不能做重做日志里没有也不能做撤销数据已改这部分修改就丢了先写日志无论崩溃发生在哪个时间点都能根据日志决定重做还是回滚。提示恢复题建议按“排序 → 说明 → 结论”作答先列出恢复步骤再写每步依据哪条日志记录最后落一句“通过先写日志原则系统能恢复到最近一个一致状态”。只答一句“先写日志再写数据库”通常拿不全分。3. 把复习题当试卷用题型打法、答题顺序与标准写法很多人拿到PDF资料就从头看答案这种做法我反对。正确用法是把复习题当试卷闭卷限时先做一遍再对答案。这一章讲每类题怎么下手答案怎么写才能拿全分。3.1 先做限时套卷选择题与填空题的高效筛查拿到资料先别翻开答案按考试时间的七到八成限时闭卷做一遍。PDF如果是电子版建议把阅读窗口缩小到只显示题目区域或者打印出来防止余光扫到题目后面的答案有些资料的答案紧跟在题目后面要特别小心先把题目区和答案区分开否则做题时很难做到真的闭卷。做题时用三色标记绿色是“会且对”黄色是“会但错”红色是“完全不会”。第一遍不用管绿色全力盯住黄和红。选择题的错因大多在概念边界比如“下列哪个不是ER图的基本要素”答案是“对象”还是“实体”要看具体选项填空题考的是术语精确度“元组”和“记录”混着写判错不算冤。做完把黄色和红色的题号记下来这就是你这份复习资料最值钱的部分。3.2 ER图转关系模式一张转换规则表吃透ER图题是操作题里的固定题型步骤完全可以规范化。完整的转换规则表放在这里做题时逐行对照ER要素转换结果最容易翻车的地方普通实体独立的关系主码即关系主码复合属性没有拆成单属性1:1联系并入任一侧在对方加入本侧主码作外码两侧都加外码造成冗余1:n联系并入n侧在n侧加入1侧主码作外码外码放在1侧语义反了m:n联系独立关系两端主码合为组合候选码漏掉组合主码或丢联系属性三元联系独立关系三个实体主码作外码候选码没有按参与度判断弱实体与强实体主码组合成主码单独设主键ISA继承子类关系存父类主码作外码把父类所有属性重复存一遍具体做题步骤固定成七步画图核对实体和联系处理1:1处理1:n处理m:n处理三元联系处理弱实体最后检查候选码和外码。m:n联系独立成关系时两端主码合起来作为该关系的候选码如果联系本身还有属性比如选课成绩这个属性放到独立关系里不要塞进任一侧实体。提示遇到带图的ER题先在草稿纸上重新抄一遍图把实体、联系、多重性标注清楚。省略这张图直接转换很容易把实体和联系看反一步错步步错。3.3 SQL大题先写关系代数再落SQLSQL操作题常见三类单表查询与分组统计、多表连接、嵌套子查询每类有固定框架。单表分组的标准写法是“GROUP BY HAVING ORDER BY”-- 题目统计每个系的学生人数只输出人数大于100的系按人数降序 SELECT dept, COUNT(*) AS cnt FROM student GROUP BY dept HAVING COUNT(*) 100 ORDER BY cnt DESC;逻辑说明WHERE在分组前逐行过滤HAVING在分组后对组过滤所以“人数大于100”是分组后的统计条件必须写在HAVINGORDER BY在分组之后执行因此可以引用别名cnt。参数说明COUNT(*)统计分组内行数不要写成COUNT(dept)——如果dept列存在NULLCOUNT(dept)会忽略NULL行统计口径就变了。多表连接有两种等价写法-- 题目查询计算机系学生的姓名和选修课程名 SELECT s.name, c.course_name FROM student s JOIN sc ON s.id sc.sid JOIN course c ON sc.cid c.cid WHERE s.dept CS;逻辑说明连接顺序是student→sc→course由外键关系决定。参数说明ON里写等值连接条件WHERE里写过滤条件把过滤条件误放进ON虽然能查出一样的结果但语义不同后续再加条件容易乱。判断结果是否正确一个办法是看行数量级计算机系学生的选课记录数绝不会超过 student×sc×course 的笛卡尔积明显超出就一定漏了连接条件。嵌套子查询“查询选修了全部课程的学生姓名”是经典中的经典SELECT name FROM student s WHERE NOT EXISTS ( SELECT 1 FROM course c WHERE NOT EXISTS ( SELECT 1 FROM sc WHERE sc.sid s.id AND sc.cid c.cid ) );逻辑说明外层遍历每个学生内层判断“是否存在一门课该学生没有选”如果不存在这样一门课说明该学生选了全部课程。参数说明SELECT 1是存在性检测的标准写法不关心返回列相关子查询要写全连接条件sc.sid s.id和sc.cid c.cid缺任何一个逻辑都会退化成笛卡尔积。3.4 事务综合题用对照表拿下隔离级别事务并发和恢复的简答、论述题答案有标准结构。隔离级别和三类异常的对应关系建议直接背表隔离级别丢失修改不可重复读读脏数据读未提交Read Uncommitted可能可能可能读已提交Read Committed可能可能不可能可重复读Repeatable Read可能不可能不可能可串行化Serializable不可能不可能不可能注意这张表描述的是隔离级别理论上允许的并发行为实际数据库产品里MySQL的可重复读还通过间隙锁处理了一部分幻读但教材阶段按这张表答题就够了。答题框架建议是“结论 → 原理 → 机制”比如问“为什么可重复读能防止不可重复读”先答结论“因为一个事务的读锁保持到事务结束其它事务无法在期间修改所读数据”再答机制“通过三级封锁协议实现”。这样既拿结论分又拿原理分比只答一句“用了行锁”要稳得多。4. 备考排查数据库复习最容易翻车的五个点这一章来自带学生复习和批改作业的血泪经验每一条对应一类高频错误对号入座比盲目刷题有用。4.1 候选码、主码、外码三个“码”混成一个现象题目让“找出关系模式的候选码”只写主码一个让“指出外码”答成“另一个表的主键”。原因教材先讲候选码再讲主码做题时把“码”当成一个笼统的词只记住了主码。再加上部分复习资料把“主码”写成“主键”干扰更大三者界限越来越模糊。解决做题第一步先分清问的是码还是键。候选码是关系内部的唯一标识由闭包算法求出主码是从候选码里选定的一个外码是跨关系的概念指向另一关系的主码。自己画一个小例子学生表学号主码、选课表学号外码在选课表里学号叫外码不叫主码。把这个例子想透三个码就分得清。4.2 3NF 与 BCNF总是少列一个函数依赖现象给定函数依赖集判断范式级别结论比标准答案高一级或低一级比如把3NF判成BCNF。原因漏了依赖。题目文字“一门课只有一个任课教师”其实是course→teacher的函数依赖没写进依赖集或者函数依赖集里有但判断时忘记把左边属性组合完整。解决先把题目所有描述翻译成显式依赖再判断范式。每判断一个范式都从头检查2NF看有没有非主属性对候选码的部分依赖3NF看有没有非主属性对候选码的传递依赖BCNF看每个决定因素是否都包含候选码。特别留意多属性候选码比如候选码是(A,B)存在B→C则C对(A,B)有部分依赖连2NF都不满足别一看到“没有非主属性”就直接跳回3NF。4.3 自然连接与等值连接同名列让结果翻车现象学生表student和系表dept都有dept_id和name两个同名列写NATURAL JOIN结果比预期少很多行或者name字段对不上。原因自然连接默认把所有同名列都作为连接条件。两张表都有name列一个是学生姓名一个是系名值大概率对不上导致大量行被连接条件过滤掉。解决写SQL时尽量不写NATURAL JOIN改成显式的JOIN ... ON只指定真正的外键列。做关系代数题时同理如果两个关系除连接属性外还有同名属性就不要用自然连接记号用等值连接加显式条件保住正确性比少写几个字更重要。4.4 视图与索引把视图当成“后悔药”现象论述题里写“视图可以加快查询速度因为视图保存了查询结果”备考阶段认为“索引建得越多越快”。原因视图本质是虚拟表不存储数据每次查询都执行定义里的SQL语句谈不上加速索引本质是B树或哈希结构能加速检索但每次INSERT、UPDATE、DELETE都要维护索引越多写代价越高。解决复习题问“视图能否加速查询”一律答否。问“索引是不是越多越好”答否要权衡读写比例和存储开销。这两个答案都比较反直觉考前专门过一遍很必要。4.5 日志恢复先写日志还是先写库现象判断题“先写数据库再写日志”被判对学生还很自信。原因没理解恢复流程把日志当成普通“记录”而不是恢复的“依据”。解决自己推一遍崩溃场景。事务T修改数据AA落盘但日志里没有对应记录此时崩溃。重启后系统不知道这个事务是否已提交数据处于新值但无法确认该不该保留。如果先写日志日志标记了事务状态就能据此决定重做还是回滚。这个推理比死记“先写日志”四个字牢得多也更容易答出原理分。5. 把复习题变成自己的知识体系三遍刷题法与组卷自查分享一个我给学生惯用的复习方法不需要额外买资料靠手头这份复习题就能把知识串成体系。第一遍按章做每章题目都做不看答案做完对答案标错。把错题按考点分类——关系模型错得多还是并发控制错得多统计错率短板章节立刻显形。这一遍不要产生“我背下来就等于会了”的错觉错题才是真正的宝藏。第二遍只做错题把错题独立重做做不对的翻回教材对应章节看定义再看答案里的解释。重点是看错因不是看结果。尤其第4章那种概念混淆型错题要搞清自己错在哪个环节是候选码漏了依赖还是隔离级别表格记反了。把错因用一句话写在题号旁边。第三遍组卷自查把各章错题打乱顺序重新限时做一遍。每道题做完在旁边用一句话写出它考的是哪个知识点——不是抄题目而是用自己的话概括。能写出来说明知识进脑子了写不出来就继续翻教材。这一步最苦但也最见效。实操上建议用表格记录错题档案错题摘要考点归属错因类型重做结果例R(A,B,C,D)求候选码第6章 关系数据理论漏闭包依赖已通过例隔离级别异常对照第9章 并发控制表格记反仍需巩固我自己的习惯是考前一周必做一张这样的表三遍刷完这张表就是考前最后半小时的背诵材料。别把PDF存在网盘里吃灰也别从头到尾抄答案当成自测工具用它的价值才会真正体现。数据库理论这门课单靠读概念永远只是“好像懂了”硬着头皮做完题、错了再查书才是最快建立知识体系的路。希望这个用复习题反推教材的复习方式帮到你。本文还有配套的精品资源点击获取