
简介这份数据库期末考试试题及答案面向高校计算机及相关专业学生用于期末复习、自测与考前查漏补缺也可供教师命题参考。内容围绕数据库系统核心知识展开涵盖DBMS、数据模型、概念模型与E-R模型、数据独立性、关系数据模型、关系规范化、事务处理与并发控制、数据库恢复等高频考点并配有单项选择题与填空题的完整答案。资源包共1个doc文件约118KB结构紧凑便于打印或电子端随时翻阅。目前已有3787人学习下载热度较高。读者可借助其中的典型题目理解主码判定、外联接、授权语句、S锁与X锁、两段锁协议等易错点对照答案梳理知识脉络快速定位薄弱环节提升应试与知识巩固效率。1. 数据库期末考试试题及答案从“背题”到“造题”的复习路径数据库期末考试试题及答案这八个字在搜索引擎里出现的频率往往集中在每学期最后两周。我见过太多同学把复习等同于“把往年题刷一遍”结果卷子一发下来题型稍微一变就当场翻车。问题不在于题刷得不够而在于没有把“试题”当成知识点的探针只记住了答案没记住答案背后的约束条件。这篇文章面向两类人一是正在准备数据库期末的学生想用最短时间把考点串成网二是需要出题或组卷的助教、老师想快速生成一套有区分度的试题。我会把“试题及答案”拆成三个可操作的部分考点如何映射到题型、每类题怎么造、答案怎么写得让阅卷人挑不出毛病。核心不是给你一份题库而是给你一套能自己生成题库的方法。数据库这门课的特点是概念多、范式判断容易混、SQL 写起来细节坑多所以复习和出题都必须围绕“可验证”三个字展开。2. 把考点拆成题型关系模型、范式与 SQL 的映射表2.1 先分清哪些考点适合出客观题哪些必须动手写数据库期末的考点大致分四块基础概念键、完整性约束、三级模式、关系代数与演算、范式与依赖、SQL 与事务。基础概念适合选择、填空、判断因为答案唯一且短关系代数和范式适合大题因为步骤多、能看出推导过程SQL 必须上手写因为语法细节和逻辑顺序骗不了人。我一般会先列一张考点-题型映射表再决定复习顺序。下面这张表是我自己组卷时用的你可以直接改成自己的版本。考点模块推荐题型分值占比参考易错点键与完整性约束选择、填空10%候选键与主键混淆关系代数计算大题15%除运算漏写函数依赖与范式推导大题20%部分依赖误判SQL 查询手写代码30%连接条件丢失事务与并发简答、判断15%隔离级别对应现象索引与存储选择、简答10%B 树与哈希适用场景这张表的价值在于它告诉你复习时间该怎么分配。SQL 占 30%那你就不能只背语法必须动手在本地数据库里跑一遍。范式占 20%那你就得把 Armstrong 公理和属性闭包算熟而不是死记“1NF 消除非原子项”这种一句话结论。2.2 用属性闭包把范式题变成可复现的步骤范式题是期末最容易拉开差距的地方。很多人判断到 2NF 就卡住是因为没有用属性闭包去验证候选键。我习惯的步骤是先求所有候选键再按定义逐级判断。下面这段 Python 代码就是用来算属性闭包的输入函数依赖集和属性集输出闭包结果。# 计算属性闭包用于判断候选键和范式级别 def closure(attrs, fds): # attrs: 初始属性集合如 {A,B} # fds: 函数依赖列表每个元素是 (左部集合, 右部集合) result set(attrs) changed True while changed: changed False for left, right in fds: # 如果左部被当前闭包包含则右部可以加入 if left.issubset(result) and not right.issubset(result): result result | right changed True return result # 示例R(A,B,C,D)F {A-B, B-C, A-D} fds [(set([A]), set([B])), (set([B]), set([C])), (set([A]), set([D]))] print(closure(set([A]), fds)) # 输出 {A,B,C,D}说明 A 是候选键这段代码的逻辑很直白反复扫描依赖集只要左部已经在闭包里就把右部并进来直到不再变化。参数说明attrs是你要测试的属性组合fds里每个依赖用两个集合表示。跑出闭包等于全部属性就说明这个组合是候选键。有了候选键再判断 2NF 看非主属性是否部分依赖候选键判断 3NF 看是否有传递依赖。这样每一步都有输出可查不是玄学。2.3 SQL 大题怎么出才能考出真实水平SQL 题最怕出成“默写题”。我出题时会刻意设计三档第一档单表条件查询第二档多表连接加分组第三档嵌套查询或存在量词。这样能区分出只会 SELECT 基本结构和真正理解关系代数的人。下面这道题是我常用的模板给出学生表、课程表、选课表要求查出“选修了全部课程的学生姓名”。标准答案用双重 NOT EXISTS但很多学生会写成 COUNT 比较这时候就要看是否处理了重复选课和空值。-- 查询选修了全部课程的学生姓名 SELECT S.name 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 ) );逻辑说明外层遍历每个学生内层检查是否存在一门课他没选。如果不存在这样的课就说明他选了全部课。参数上要注意SC表里sid和cid的联合主键以及NULL值不会参与EXISTS判断。阅卷时我会重点看学生有没有把NOT EXISTS写成NOT IN因为后者遇到空值会返回错误结果这是血泪经验。3. 答案怎么写才经得起推敲评分点与常见扣分项3.1 把答案拆成评分点而不是写一段话很多同学答案写得很长但得分低原因是没踩到评分点。我批卷时习惯把每道大题拆成 3 到 5 个评分点每个点对应一个关键步骤。比如范式题评分点通常是求候选键2 分、判断 2NF2 分、判断 3NF2 分、给出分解4 分。你写答案时就应该按这个结构分段让阅卷人一眼看到。下面这张表是我给一道 10 分范式题定的评分细则你可以用来检查自己的答案是否完整。评分点分值常见扣分原因写出所有候选键2漏掉组合键说明部分依赖2只写结论不写依赖说明传递依赖2把部分依赖当传递给出 3NF 分解4分解后丢失依赖3.2 简答题用“定义判断例子”三段式事务隔离级别这种简答题很多学生只背了四个级别名称结果问“不可重复读对应哪个级别”就答不上来。我建议的答题模板是先写定义再写该级别能防止和不能防止的现象最后给一个具体场景。比如“读已提交”可以防止脏读但不能防止不可重复读场景是两次读同一行中间被其他事务修改并提交。这种三段式的好处是即使你记不清某个细节定义和例子也能拿到基础分。我见过太多人只写一句“读已提交防止脏读”结果 5 分题只拿 1 分。3.3 用本地数据库验证你的答案SQL 题写完不要靠眼睛检查直接在本机跑一遍。我一般用 SQLite 或 MySQL 建三张表插入几行边界数据把答案跑出来看结果。下面这段 bash 命令是在 SQLite 里快速建表和验证的流程。# 创建测试数据库并建表 sqlite3 test.db EOF CREATE TABLE Student (sid INTEGER PRIMARY KEY, name TEXT); CREATE TABLE Course (cid INTEGER PRIMARY KEY, cname TEXT); CREATE TABLE SC (sid INTEGER, cid INTEGER, PRIMARY KEY(sid,cid)); INSERT INTO Student VALUES (1,A),(2,B),(3,C); INSERT INTO Course VALUES (10,DB),(20,OS); INSERT INTO SC VALUES (1,10),(1,20),(2,10); EOF # 运行你的查询观察结果是否符合预期 sqlite3 test.db SELECT S.name FROM Student S WHERE NOT EXISTS (SELECT 1 FROM Course C WHERE NOT EXISTS (SELECT 1 FROM SC WHERE SC.sidS.sid AND SC.cidC.cid));逻辑说明先插入 A 选了全部两门课B 只选了一门C 一门没选。正确结果应该只返回 A。如果你跑出来是 A 和 B说明NOT EXISTS写错了。参数上注意 SQLite 的PRIMARY KEY和 MySQL 语法略有差异但逻辑一致。这种验证习惯能让你在考场上少丢很多冤枉分。4. 避坑与排查数据库期末复习中最容易翻车的五个点4.1 把候选键和主键混为一谈现象题目问“写出所有候选键”学生只写了一个主键。原因平时建表时习惯用id做主键就以为候选键只有一个。解决候选键是能唯一标识元组的最小属性集可能有多个。做题时先求属性闭包把所有能推出全部属性的最小组合都列出来再从中选一个当主键。4.2 范式判断时跳过 2NF 直接看 3NF现象分解出来的关系模式满足 3NF但存在部分依赖。原因3NF 的定义里包含 2NF但很多教材的判断题只让你判断“是否 3NF”学生就忽略了部分依赖。解决严格按 1NF、2NF、3NF 顺序判断每一步都写清楚依赖关系。如果存在部分依赖那它一定不是 2NF也就不可能是 3NF。4.3 SQL 里 WHERE 和 HAVING 用错位置现象查询分组后的条件结果报错或结果不对。原因WHERE在分组前过滤行HAVING在分组后过滤组。解决记住“行过滤用 WHERE组过滤用 HAVING”。如果条件里出现聚合函数比如COUNT(*) 2必须放HAVING。4.4 事务隔离级别对应现象记反现象问“哪个级别能防止幻读”答成“读已提交”。原因四个级别和三种现象脏读、不可重复读、幻读的对应关系是表格容易记串。解决用口诀“读未提交全不防读已提交防脏读可重复读防脏读和不可重复读串行化全防”。然后自己画一张表默写一遍。4.5 关系代数除法运算漏写条件现象题目要求“查询选修了全部课程的学生”用除法时只写了投影没写条件。原因除法运算的公式记不全。解决除法R ÷ S等价于π_x(R) - π_x((π_x(R) × S) - R)。写的时候先算笛卡尔积再减最后投影。每一步都写出来不要跳步。5. 从试题到能力用一套自测脚本把复习闭环最后一章我想讲一个具体技巧用脚本随机生成试题并自动判分。这个方法适合复习后期能帮你快速定位薄弱点。思路是维护一个题库文件每道题带考点标签和标准答案脚本随机抽题、你输入答案、脚本比对并统计各考点正确率。下面是一个简化版的 Python 自测脚本题库用 JSON 格式支持选择题和填空题。import json, random # 题库示例每道题有考点、题干、答案 bank [ {tag: 范式, q: R(A,B,C)中A-B,B-C最高满足第几范式, a: 2NF}, {tag: SQL, q: 分组后过滤应使用哪个关键字, a: HAVING}, {tag: 事务, q: 能防止脏读的最低隔离级别是, a: 读已提交} ] random.shuffle(bank) score {} for item in bank: ans input(item[q] ) correct ans.strip().lower() item[a].lower() tag item[tag] score.setdefault(tag, [0, 0]) score[tag][1] 1 if correct: score[tag][0] 1 # 输出各考点正确率 for tag, (right, total) in score.items(): print(f{tag}: {right}/{total} {right/total:.0%})逻辑说明bank是题库列表每个元素包含考点标签、题干和标准答案。脚本打乱顺序后逐题提问比对时忽略大小写和首尾空格。最后按考点统计正确率。参数上你可以把bank换成从 JSON 文件读取方便扩充。这个脚本的价值在于它把“刷题”变成了“按考点统计”你能清楚看到自己是范式弱还是 SQL 弱然后针对性补。我自己的习惯是考前三天每天跑一轮正确率低于 80% 的考点就回去翻笔记重做例题。这个习惯让我从“背答案”变成了“查漏洞”效果比盲目刷整套卷子好得多。数据库这门课试题和答案只是表象真正要练的是看到题目能反推出它想考哪个约束、哪个依赖、哪个隔离级别。希望帮到你。本文还有配套的精品资源点击获取