简介:面向数据库课程学习者与备考者的系统复习资料,整理数据库系统概论各章核心考点与试题,覆盖数据管理技术发展、概念模型、数据库特点、三级模式两级映射、完整性约束、安全性控制、事务与并发控制等关键内容。资料以复习试题与参考答案形式呈现,包含选择题、填空题、简答题等常见题型,能帮助读者快速回顾理论知识并检验掌握程度。资源包内含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大题:先写关系代数,再落SQL
SQL操作题常见三类:单表查询与分组统计、多表连接、嵌套子查询,每类有固定框架。
单表分组的标准写法是“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”是分组后的统计条件,必须写在HAVING;ORDER BY在分组之后执行,因此可以引用别名cnt。参数说明:COUNT(*)统计分组内行数,不要写成COUNT(dept)——如果dept列存在NULL,COUNT(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修改数据A,A落盘但日志里没有对应记录,此时崩溃。重启后系统不知道这个事务是否已提交,数据处于新值,但无法确认该不该保留。如果先写日志,日志标记了事务状态,就能据此决定重做还是回滚。这个推理比死记“先写日志”四个字牢得多,也更容易答出原理分。
5. 把复习题变成自己的知识体系:三遍刷题法与组卷自查
分享一个我给学生惯用的复习方法,不需要额外买资料,靠手头这份复习题就能把知识串成体系。
第一遍按章做:每章题目都做,不看答案,做完对答案标错。把错题按考点分类——关系模型错得多还是并发控制错得多?统计错率,短板章节立刻显形。这一遍不要产生“我背下来就等于会了”的错觉,错题才是真正的宝藏。
第二遍只做错题:把错题独立重做,做不对的翻回教材对应章节看定义,再看答案里的解释。重点是看错因,不是看结果。尤其第4章那种概念混淆型错题,要搞清自己错在哪个环节:是候选码漏了依赖,还是隔离级别表格记反了。把错因用一句话写在题号旁边。
第三遍组卷自查:把各章错题打乱顺序重新限时做一遍。每道题做完,在旁边用一句话写出它考的是哪个知识点——不是抄题目,而是用自己的话概括。能写出来说明知识进脑子了;写不出来就继续翻教材。这一步最苦但也最见效。
实操上,建议用表格记录错题档案:
| 错题摘要 | 考点归属 | 错因类型 | 重做结果 |
|---|---|---|---|
| 例:R(A,B,C,D)求候选码 | 第6章 关系数据理论 | 漏闭包依赖 | 已通过 |
| 例:隔离级别异常对照 | 第9章 并发控制 | 表格记反 | 仍需巩固 |
我自己的习惯是考前一周必做一张这样的表,三遍刷完这张表就是考前最后半小时的背诵材料。别把PDF存在网盘里吃灰,也别从头到尾抄答案,当成自测工具用,它的价值才会真正体现。数据库理论这门课,单靠读概念永远只是“好像懂了”,硬着头皮做完题、错了再查书,才是最快建立知识体系的路。希望这个用复习题反推教材的复习方式帮到你。
本文还有配套的精品资源,点击获取