简介完整版数据库系统概论期末考试试题适合计算机专业学生、备考研究生及自学数据库基础知识的读者作为考前强化资料。内容覆盖数据库系统基础、关系数据库、SQL语言、数据库设计、DBMS、数据安全、事务处理、并发控制及数据库恢复等核心模块包含选择题、填空题、判断题、简答题和应用题等多种题型并附有部分参考答案与解题思路。资源为单个Word文档压缩包约170KB便于打印或存档也适合按知识点逐项自测。目前已有3498人学习使用权威性与实用性兼备。通过练习可系统梳理候选码、外码、视图安全控制、无损连接判断等高频考点同时加深对关系代数和封锁机制的理解是考前查漏补缺的实用资料。1. 数据库系统概论期末试题老题新做这套卷子值得精刷在我经手过的数据库复习资料里这套「数据库系统概论期末试题」性价比很高。它收录了2002级到 2001级计算机专业的四套完整试卷选择题、填空题、判断题、简答题、应用题、综合题全都有覆盖物理数据独立性、关系代数、SQL、范式分解、ER 图转换、并发控制与事务恢复这些硬核考点。它不是知识点讲义也不是单一题型的碎片练习而是成套的原卷适合考前两周做全真模拟也适合考研党摸清学校出题风格。如果你正在备考数据库原理课程这份资料的正确用法不是“看一遍”而是“当试卷做”先拆考点地图再练标准解法最后闭卷限时批分。2. 把选择题和填空题变成考点地图高频考点与易混淆概念2.1 选择题命题规律同一批考点在四套卷里反复出现打开这几份试卷选择题第一题通常是数据独立性第二题是数据库系统的特点中间会依次出现关系代数三大专门运算、候选码定义、SQL 语言分类、视图本质、规范化目的、授权目的、锁的语义、事务特性、封锁机制。这些考点不是偶然分散的而是数据库系统概论课程的主线。我把四套卷里反复出现的考点归成一张表复习时按这个顺序走比按目录一章章翻教材快得多。考点典型问法拿分要点物理数据独立性指应用程序与磁盘上数据库物理模式相互独立关键词是“物理存储”和“应用程序”数据库系统特点数据共享、数据独立、减少冗余、避免不一致、加强数据保护干扰项常是“数据保密”数据库语言查询、插入、修改、删除属于哪种语言操作数据是 DML定义结构是 DDL授权是 DCL关系三大运算取属性是投影取元组是选择共同属性连接是新表先看清问的是“列”还是“行”候选码能唯一标识元组的一个或多个属性关键在“唯一标识”和“任意元组”视图数据库只存放视图的定义视图是虚表不落数据规范化目的解决数据冗余不要选“提高查询速度”授权功能属于数据库安全性和完整性、可靠性、一致性分开S 锁T 可读不可改其他事务只能再加 S 锁S 与 S 兼容S 与 X 不兼容事务原子性所有操作要么都做要么都不做其他选项对应持久性、隔离性、一致性并发控制封锁机制是主要方法完整性、安全性、恢复都不是锁的主要职能这张表不是让你背而是做题前先过一遍。四套卷子就是这些考点换着方式考。比如“候选码”这一项2002 级卷子考定义2001 级 B 卷又考了一遍几乎一样的题干只换了提问角度。选择题拿分的关键在于对概念做“精确辨析”。物理数据独立性里有个“物理”如果题干换成逻辑数据独立性正确答案就变成“应用程序与数据库中数据的逻辑结构相互独立”。两个概念互为对照记忆效果更好。数据库系统的特点正确答案总是“数据共享、数据独立、减少冗余、避免不一致和加强数据保护”。干扰项“数据保密”并不是系统特点而是通过授权机制实现的保护手段。做这类题时不要代入互联网产品里的工程经验考试考的是教材定义写论文、做项目积累的“数据共享”直觉在这里反而容易干扰判断。2.2 填空题判断题的概念边界DBMS、外码、事务与故障填空题里最常被卡住的是缩写题。DBMS 是数据库管理系统DBA 是数据库管理员这两个缩写本身不难难的是区分“数据库管理系统”和“数据库系统”。DBMS 是软件是系统核心数据库系统还包括数据库、应用系统、DBA 和用户范围更宽。如果一个空让你填“核心软件”优先写“数据库管理系统。”传统集合的并、交、差运算施加于两个关系时需要两个条件属性个数必须相等对应属性值必须取自同一个域。这个考点属于关系代数的前置条件考的就是集合运算对关系的约束。外码的经典填空题值得单独说。关系 ASSND和 BDCNNM中A 的主码是 SB 的主码是 D问 D 在 A 中叫什么。答案是外码。判断方法很直接看这个属性是不是另一个关系的主码。如果是在当前关系里就是外码。学生库的 STUDENT、COURSE、SC 三张表也是同一个套路SC 里的 SNO 参照 STUDENTCNO 参照 COURSE两个都是外码。数据冗余可能导致的问题填空标准答案是“浪费存储空间及修改麻烦”。这背后还隐含一个一致性风险同一数据多处存储改一处漏一处数据就不一致了。数据库在运行过程中可能产生的故障分三类事务故障、系统故障、介质故障对应 Transaction failure、System crash、Disk failure。系统故障的特征是内存信息丢失、外存数据不受影响介质故障才是物理磁盘损坏。判断题和简答题更抠概念边界。比如“View 可串行化的调度也一定是冲突可串行化的调度”这句话是错的教材里有一个反例调度。这类题光背结论没用需要知道原因视图可串行化允许“盲写”这种特殊操作而冲突可串行化对操作交换条件要求更严因此前者范围更大后者是前者的子集。记不住反例时就记结论“视图可串行化范围大于冲突可串行化反之不成立。”事务的提交和回滚是简答高频题。COMMIT 是把事务所有更新写回磁盘上的物理数据库事务正常结束ROLLBACK 是事务运行过程中发生故障系统把所有已完成的更新操作全部撤销使数据库回滚到事务开始时的状态。回答时各写一句定义再补一句“回滚是事务原子性在实现层的体现”基本就是满分结构。2.3 做一张考点自查清单四套卷变成一张复习表我不建议把真题做完就扔到一边更推荐做一个考点自查清单。格式可以很简单一张纸分三列考点名称、题目位置、掌握程度。掌握程度只填“已掌握 / 会推理 / 待补强”三档。“会推理”和“已掌握”的区别很重要范式题你看着答案能懂不代表自己能推出来只有白纸闭卷写出完整步骤才算“已掌握”。具体操作分三步。第一步每做完一份卷子把错题和蒙对的题填进表格。第二步两天后回看不重做整卷只抽查“待补强”项能否独立写出推理过程。第三步如果某个考点连续两次出现待补强回到教材对应章节重新过一遍定义。这套方法不玄学就是强制你从“看题”切换到“解题”。这套题来自 2002 级和 2001 级但范式、闭包、SQL 这些概念在所有数据库教材里都不会变不管你现在用第五版还是第六版考点都能对上。3. 关系代数与 SQL 实战投影、选择、连接的三类标准解法3.1 关系代数先想执行语义投影、选择、连接与自然连接的差别选择题里问“从表中取出满足条件的属性的操作称为①B从表中选出满足某种条件的元组的操作称为②A将两个关系中具有共同属性值的元组连接到一起构成新表的操作称为③C。”答案就是投影、选择、连接。最容易翻车的是把选择和投影记反。我记的时候用一句话选择是横着切行投影是竖着切列。连接则复杂一点本质是先做笛卡尔积再按连接条件做选择最后做投影。去掉重复属性的自然连接就是等值连接的特例。自然连接与等值连接的区别几乎每年都考。等值连接写为 R ⋈ AB S自然连接写为 R ⋈ S。两个区别要记住自然连接要求相等的分量必须是公共属性等值连接只要属性值相等即可不要求公共属性自然连接会去掉重复属性等值连接保留全部属性。答题顺序先写定义再写“自然连接一定是等值连接等值连接不一定是自然连接”最后补重复属性处理方式的差异就是满分。真题里还有一类“元组关系演算表达式”题比如检索选修“程军”老师课程的学生姓名{ T(1) | (∃U)(∃V)(∃W)( S(U) ∧ SC(V) ∧ C(W) ∧ T[1]U[1] ∧ U[1]V[1] ∧ V[2]W[1] ∧ W[3]程军 ) }这类题考研复试会出现本科生期末考试一般只要求能读懂不要求自己写。看懂它的关键是每个存在量词绑定一张表后面的等值条件本质就是 SQL 里的连接条件T[1] 表示结果只有一列。元组关系演算虽然不常用但它是关系模型数学基础的组成部分选择题里也可能考概念归属。3.2 四道 SQL 应用题手写子查询、连接与 GROUP BY 的标准写法真题里有一段经典的学生选课库SS#, SN, SEX, AGE, DEPT、CC#, CN、SCS#, C#, GRADE。四道 SQL 题分别是比王华年龄大、选 C2 成绩最高、查姓名课程号成绩、统计选四门课程的学生总成绩。这些题在现在的 SQL 里一句话就能写完但考试手写 SQL 最容易丢分的是子查询和 GROUP BY 的配合。第一题检索所有比“王华”年龄大的学生姓名、年龄和性别SELECT SN, AGE, SEX FROM S WHERE AGE ( SELECT AGE FROM S WHERE SN 王华 );这里的子查询是标量子查询返回一个值外层用它做年龄比较。执行顺序是先算子查询拿到王华的年龄再逐行比较外层 S 表的 AGE把大于该值的行选出来最后投影三列。注意考试默认“王华”唯一如果题目没有说明不能重名直接按标准写法即可。第二题检索选修课程“C2”的学生中成绩最高的学生的学号SELECT S# FROM SC WHERE C# C2 AND GRADE ( SELECT MAX(GRADE) FROM SC WHERE C# C2 );子查询算出 C2 的最高分外层把 C2 里成绩等于该值的学号选出来。内层 WHERE C#C2 一定不能漏否则 MAX 取的是所有课程最高分外层筛选条件就错了。这道题还可以用 ORDER BY GRADE DESC LIMIT 1 实现但那是 MySQL 写法考试教材一般以标准 SQL 为准不建议混用。第三题检索学生姓名及其所选修课程的课程号和成绩SELECT SN, C#, GRADE FROM S, SC WHERE S.S# SC.S#;这是隐式连接写法。FROM 后面跟两张表WHERE 里写连接条件作用等价于 INNER JOIN。三列分别来自 S 和 SC连接条件是 S# 相等。写连接条件时一定要加表名前缀因为两张表都有 S#直接写 S#S# 会产生歧义阅卷时也会认为你不清楚列归属。第四题检索选修四门课程的学生总成绩SELECT S#, SUM(GRADE) FROM SC GROUP BY S# HAVING COUNT(C#) 4;执行顺序是先按 S# 分组各组内用 SUM(GRADE) 算总成绩再用 HAVING COUNT(C#)4 筛掉不是四门课的组。HAVING 和 WHERE 不能互换WHERE 是分组前对行过滤HAVING 是分组后对组过滤。这里如果用 WHERE COUNT(C#)4SQL 语法直接报错因为聚合函数不能出现在 WHERE 里。注意考试手写 SQL 时不要写 SELECT *。虽然能跑和题目投影要求不符按列给分的阅卷方式下容易扣分。3.3 子查询与连接的取舍换一种写法验证语义真题里第四题有很多等价写法。比如先按 S# 分组筛出四门课的学生再连 S 表取姓名但题目只要学号和总成绩没有必要多连一张表。我的习惯是需要跨多张表取列用连接只是在原表上按条件筛行优先子查询要做聚合统计GROUP BY HAVING 是唯一标准路径。如果被迫写嵌套子查询先检查能否用连接改写。换写法不换语义的练习对考试很有用。第一题改写成连接写法也可以先自连接取出王华年龄再过滤但子查询更直观减少出错概率。第二题如果用连接需要先在子查询里算最高分外层再连接写法绕了一圈。判断标准是读题时如果已经能明确结果的列来自哪些表就用连接如果条件是“某个值来自同一张表自身的聚合结果”就用子查询。4. 范式分解与 ER 图建模从函数依赖到关系模式的完整路径4.1 Armstrong 公理与闭包计算从合并规则证明到代码验证真题里有一道证明题若 X-Z, X-Y, 则 X-YZ要求用 Armstrong 公理证明。标准证法三步因为 X-Y增广律得 X-XY因为 X-Z增广律两边加 Y 得 XY-ZY最后 X-XY 和 XY-ZY 用传递律得 X-YZ。这个证明不复杂但阅卷按步骤给分每一步都要写清楚用的是哪条公理漏写公理名称会扣分。闭包计算是另一类必考计算题。给定 F { A→BC, CD→E, B→D, E→A }求 B 和 (AC)。我一般用一段简单的 Python 脚本验证避免手算犯错def closure(attrs, fds): x set(attrs) changed True while changed: changed False for lhs, rhs in fds: if set(lhs).issubset(x) and not set(rhs).issubset(x): x | set(rhs) changed True return .join(sorted(x)) fds [(A, BC), (CD, E), (B, D), (E, A)] print(closure(B, fds)) # BD print(closure(AC, fds)) # ABCDE这个脚本的核心逻辑是循环扫描函数依赖直到没有新属性加入为止。参数 attrs 是初始属性集合fds 是函数依赖列表每个元素是一个二元组第一项是箭头左侧属性第二项是箭头右侧属性。脚本内部用集合判断“左侧子集是否已全部包含在闭包中”一旦满足就把右侧属性并进来。手算时也遵循同一流程只是把“循环扫描”换成人肉迭代。B 的推演是初始 X{B}扫描到 B→D加入 D得 X{B,D}再扫一轮无新属性停止BBD。(AC) 则要经过多轮A→BC 加入 B、CB→D 加入 DCD→E 加入 E最后得 ABCDE。4.2 范式判断三步走从 1NF 到 3NF 的工厂日产量题范式题在综合题里分值很高工厂日产量那道题是标准模板。关系 R(职工编号, 日期, 日产量, 车间编号, 车间主任)规定每个职工每天只有一个日产量每个职工只能隶属于一个车间每个车间只有一个车间主任。根据这些规定写出基本 FD(职工编号, 日期) → 日产量职工编号 → 车间编号车间编号 → 车间主任关键码是 (职工编号, 日期)。因为职工编号 → (车间编号, 车间主任)而职工编号是候选码的子集存在非主属性对候选码的部分函数依赖所以 R 不是 2NF。第一步分解把引起部分依赖的属性拆出去R1(职工编号, 车间编号, 车间主任)R2(职工编号, 日期, 日产量)到这里 R1 和 R2 都是 2NF。继续检查 R1职工编号 → 车间编号车间编号 → 车间主任所以“职工编号 → 车间主任”是传递依赖R1 不是 3NF。再拆R11(职工编号, 车间编号)R12(车间编号, 车间主任)最终 ρ { R11, R12, R2 } 是 3NF 模式集。每一步都要写清“因为存在什么依赖所以当前不是几NF”过程分占比很高。BCNF 的判断在此基础上更进一步每个函数依赖的决定因素必须是候选码。R2、R11、R12 里的 FD 左侧都是候选码所以它们同时也是 BCNF。4.3 ER 图转关系模型车辆管理系统主键外键计数技巧最“重量级”的综合题是交警大队的车辆信息管理系统。7 个实体类型制造商、交通管理大队、警察、车主、车辆、驾驶员、保险公司8 个联系类型其中 5 个是 1:N1 个是 M:N2 个是 M:N:P。转换规则就三条实体直接变关系属性照搬1:N 联系把 1 端主码并入 N 端实体关系并继承联系属性M:N 或 M:N:P 联系新建独立关系里面放参与实体的主码组合和联系自身属性。按这三条规则7 个实体转 7 个关系1 个 M:N 联系转 1 个关系2 个 M:N:P 联系转 2 个关系共 10 个关系模式。转换结果如下关系模式主键外键制造商(制造商编号, 名称, 地址)制造商编号无交通管理大队(大队编号, 地址, 区域, 电话)大队编号无警察(警号, 姓名, 性别, 出生年月, 大队编号)警号大队编号车主(身份证号, 姓名, 地址, 电话)身份证号无车辆(车辆牌号, 型号, 发动机号, 座位数, 登记日期, 制造商编号, 保险公司编号, 车主身份证号)车辆牌号制造商编号, 保险公司编号, 车主身份证号驾驶员(驾驶证号, 姓名, 性别, 地址, 准驾车型, 发证日期, 保险公司编号)驾驶证号保险公司编号保险公司(保险公司编号, 名称, 地址, 电话)保险公司编号无违章(违章编号, 时间, 地点, 违章行为, 处理结果, 车辆牌号, 驾驶证号, 警号)违章编号车辆牌号, 驾驶证号, 警号事故(事故编号, 时间, 地点, 事故简要, 处理结果, 车辆牌号, 驾驶证号, 警号)事故编号车辆牌号, 驾驶证号, 警号被盗(被盗编号, 被盗时间, 被盗地点, 找回时间, 找回地点, 车主身份证号, 车辆牌号)被盗编号车主身份证号, 车辆牌号做完后数主键和外键是个很好的自检手段。10 个关系各一个主键主键总数为 10外键数逐一数警察 1车辆 3驾驶员 1违章 3事故 3被盗 2合计 13。答案里“主键总数 10、外键总数 13”就是这么来的。如果你的转换结果数不出这两个数字说明某条 1:N 联系被错误地单独建表或者 M:N 联系漏了属性回头检查规则就能定位问题。5. 期末复习避坑指南五类高频错误的根因与修正方法5.1 坑一候选码计算漏掉“不出现在函数依赖中的属性”现象判断“如果属性 X 在函数依赖的左右都不出现则候选码中必不包含 X”这个结论时判断成正确导致候选码计算少一个关键属性。原因潜意识里觉得候选码属性一定在函数依赖左侧或右侧出现过忽略了当一个属性完全不出现在 F 中时它无法通过 FD 被推导出来。闭包计算只能从左侧推到右侧如果 X 既不在左侧也不在右侧任何函数依赖都无法把 X 加进闭包要想让闭包覆盖整个 U只能把 X 作为候选码的组成部分。解决解候选码题之前先做一步标记把 U 中每个属性与 F 的左右两侧比对。凡是在 F 中左右都不出现的属性直接标为“必选属性”每个候选码都必须包含它。之后再对剩余属性做组合求闭包闭包等于 U 的组合才是候选码。原题的结论正好相反候选码中必包含 X因为只有 X 能函数决定 X。5.2 坑二无损连接判断只扫描一轮函数依赖现象做无损连接分解题时二维表更新了几格就下结论“有损”或者漏掉了把某一行补成全部 a 的关键步骤。原因对算法收敛条件理解不深以为每条函数依赖只能用一次。实际上算法要求反复扫描整个 FD 集合直到某轮不再产生任何变化为止。很多人扫完第一轮看结果还不对就开始怀疑分解本身有错而不是怀疑自己没迭代够。解决画初始表填好 a/b 符号每轮按顺序应用所有 FD一轮结束后回到第一条 FD 再来一轮直到无变化。最后看是否存在某一行全部是 a存在则无损否则有损。真题 RU,F, U{A,B,C,D,E}, F{AB→C, C→D, D→E}分解为 R1(A,B,C), R2(C,D), R3(D,E)。初始表是A B C D E R1 a1 a2 a3 b14 b15 R2 b21 b22 a3 a4 b25 R3 b31 b32 b33 a4 a5应用 C→D 后R1 的 D 从 b14 变为 a4应用 D→E 后R1 的 E 从 b15 变为 a5R2 的 E 从 b25 变为 a5。第二轮继续扫描R1 那一行已经全是 a所以分解是无损的。整个过程必须在纸上完整走两遍这一步的血泪经验是只扫一遍就翻车的人比想象中多。5.3 坑三2NF 到 3NF 的分解漏掉传递依赖现象把工厂日产量关系 R 拆成 R1(职工编号, 车间编号, 车间主任) 和 R2(职工编号, 日期, 日产量) 就停笔以为已经到 3NF结果被扣掉综合题后半段的分。原因只检查了“部分函数依赖”没继续检查“传递函数依赖”。R1 里职工编号 → 车间编号车间编号 → 车间主任构成传递依赖所以 R1 仍然不是 3NF。只有把 R1 再拆成 R11(职工编号, 车间编号) 和 R12(车间编号, 车间主任)才算完成。解决每次分解后给每个子关系单独列出所有函数依赖逐个检查是否存在“X→Y 且 Y→Z 但 Z 不是 X 的子集”的情况。若有继续分解。更严格的做法是检查每个 FD 的左侧是否为超码如果是就已经到 BCNF可以停手。养成“分解后复查”的习惯能避免在综合题里丢一半分数。5.4 坑四视图和授权概念混为一谈现象选择题问“数据库中只存放视图的什么”有人凭直觉选“对应的数据”还有人把视图机制和 GRANT 授权当成一回事。原因把视图当成了物理表。视图是虚表从基本表导出数据库只保存其定义不保存数据每次查询视图时实时从基本表计算。授权是另一个维度GRANT 控制的是用户对表或视图的操作权限。视图能保护机密数据是因为“不同用户看到不同行/列”授权能保护机密数据是因为“不同用户能否执行某个操作”。解决记两个结论。第一数据库只存放视图的定义视图数据不落盘。第二视图和 GRANT 是两条并行的安全手段。例如建立信息系学生视图CREATE VIEW IS_Student AS SELECT Sno, Sname, Sage FROM Student WHERE Sdept IS;再把查询权限授给用户 U1GRANT SELECT ON TABLE Student TO U1;两者都跟安全性有关但一个是“隐藏数据”一个是“限制操作”。题目如果问“数据库只存放视图的什么”只有一个标准答案定义。5.5 坑五丢失修改和读脏数据分不清现象事务 T1 读 A10T2 读 A10T1 写 A5T2 写 A2判断并发异常时有人选“读脏数据”正确答案是“丢失修改”。另一张图 T1 读 A100改 A200 写回T2 读 A200T1 回滚恢复 A100才对应“读脏数据”。原因混淆了“覆盖未提交修改”和“读取未提交修改”。两道题的共同点是都有两个事务交叉执行但关键在最后被覆盖或读取的是什么状态。丢失修改是两个事务都写了同一个值后写者覆盖先写者一个更新凭空消失读脏数据是事务读取了另一个未提交事务写过的数据而那个事务随后回滚读到的是从未正式生效的值。解决判题时先画时间线标出读、写、回滚三个动作。如果时间线上有两次写同一个数据且没有加锁优先怀疑丢失修改如果时间线上出现“读到了被修改但尚未提交的值之后写入事务回滚”优先怀疑读脏数据。还有一类“不能重复读”特征是同一事务两次读取同一数据得到不同值但两次读取之间另一个事务提交了修改。三类异常对照记选择题基本不会错。6. 用真题做一次全真模拟时间分配与复盘清单这套资料有四套卷别一上来就全做完。留一套你相对陌生的年份当模拟卷另外几套拆开当题库练。模拟那天手机扔远按正式考试时间闭卷两小时。我的时间分配是选择题加填空题控制在 35 分钟内判断题 15 分钟简答题 20 分钟应用题和综合题 50 分钟最后留 10 分钟检查主键外键数量和 SQL 列名。一旦到点就停笔然后对照答案批分。批分时不要只看总分按题型统计失分点。概念题失分多回到考点表过一遍易混项SQL 题失分多把第 3 章的四道题手写三遍范式综合题失分多按第 4 章的分解路径重推工厂日产量题。重复出现的错因写在一张纸条上贴到复习资料第一页进考场前扫一眼。这个方法对我很有效因为真题的价值不在“做过”而在“知道自己哪类题被扣分”。从那以后我每次复习都强制自己先模拟一次再进考点把丢分点缩小到几个固定类型再遇到类似的闭包计算、无损连接判断题就不再手软。希望帮到你。本文还有配套的精品资源点击获取