简介:这份数据库期末考试试题及答案面向高校计算机及相关专业学生,用于期末复习、自测与考前查漏补缺,也可供教师命题参考。内容围绕数据库系统核心知识展开,涵盖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 分)、判断 2NF(2 分)、判断 3NF(2 分)、给出分解(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.sid=S.sid AND SC.cid=C.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% 的考点就回去翻笔记重做例题。这个习惯让我从“背答案”变成了“查漏洞”,效果比盲目刷整套卷子好得多。数据库这门课,试题和答案只是表象,真正要练的是看到题目能反推出它想考哪个约束、哪个依赖、哪个隔离级别。希望帮到你。
本文还有配套的精品资源,点击获取