数据库期末考试试题及答案:从题型拆解到SQL大题实战的复习闭环 简介这份数据库期末考试试题及答案面向高校计算机及相关专业学生用于期末复习、自测与查漏补缺也可供备考数据库原理类课程的读者对照练习。资源以doc文档形式打包共1个文件压缩包约118KB内容为一份完整的期末试卷及配套答案涵盖单项选择题、填空题等题型便于直接打印或在线刷题。试题覆盖数据库系统核心概念、数据模型与概念模型、数据独立性、关系数据模型、E-R模型、数据库设计、关系规范化、事务处理与数据库恢复等知识点例如DBMS的地位、逻辑数据独立性对应的映象修改、实体主码判定、全外联接的使用场景、GRANT授权语句、E-R模型转换后关系数目、S锁与X锁的相容性等均配有明确答案与解析线索。目前已有3787人学习下载适合需要系统梳理考点、检验掌握程度的读者使用。1. 从一套试题倒推数据库期末的复习路径期末前一周实验室里最常见的一幕是几个人围着一份往年的数据库试卷边对答案边翻教材翻到第三范式那里卡住然后开始怀疑自己这学期到底学了什么。这套「数据库期末考试试题及答案」资源本质上就是给这种场景准备的一份可复现的复习底稿——它把选择题、填空题、简答题和 SQL 大题按知识点归拢答案部分保留了推导过程而不是只给一个结果。适合谁适合已经上完课、需要把零散知识压成一条主线的人也适合带课的助教拿来当出题参照。它不解决「从零学数据库」但能解决「知道考什么、知道自己哪块虚」这两个最要命的问题。下面我按拆一份试卷的真实顺序把这份资源怎么用、参数怎么对、坑在哪讲清楚。2. 拆解试题结构从题型分布看考点权重2.1 先统计题型与分值别急着做题拿到任何一套数据库试题第一件事不是从头做到尾而是先做一次结构统计。常见做法是把题型、题量、单题分值、涉及章节列成一张表这样你能一眼看出这套卷子是偏理论还是偏 SQL 实操。我一般会先扫一遍把每道题对应的知识点标在题号旁边比如「3NF 判定」「事务隔离级别」「索引失效场景」标完再统计频次。题型常见题量单题分值主要覆盖章节单选152012基础概念、范式、键填空81012SQL 语法、约束、函数简答4658事务、并发、索引原理SQL 大题35812多表连接、子查询、聚合设计题121015ER 图转关系模式、范式分解这张表的价值在于如果 SQL 大题占了 40 分而你连GROUP BY和HAVING的执行顺序都说不清那复习优先级就非常明确了。统计完再动笔比盲目刷题省一半时间。2.2 按知识点给题目打标签统计完分值第二步是给每道题打知识点标签。这一步决定了你后面能不能做「错题归因」。我习惯用三个维度打标签章节如「关系模型」「事务」「索引」、能力层级记忆 / 理解 / 应用、易错点如「NULL 比较」「幻读」「最左前缀」。举个具体例子一道题问「SELECT * FROM t WHERE a NULL返回什么」标签就是章节SQL 基础能力理解易错点NULL 参与比较。打标签的过程本身就是一次快速复习因为你要判断这道题到底在考什么。打完标签后把所有标签汇总出现频次最高的三到五个知识点就是你接下来要重点攻的。提示标签不要打得太细否则汇总时会被噪声淹没。控制在 15 个以内每个标签能对应教材的一个小节即可。2.3 用答案反推评分标准这套资源里答案部分是有推导的这一点比只给结果的值钱。看答案时不要只看对错要看它「怎么给分」。比如一道 SQL 大题答案可能先写连接条件再写过滤最后写排序每一步都对应一个得分点。你按这个顺序去对就能知道自己丢分是丢在语法、逻辑还是格式上。常见做法是把答案的每一步拆成「得分动作」然后拿自己的作答逐条比对。如果答案里用了LEFT JOIN而你用了INNER JOIN那丢的不只是语法分还有对业务语义的理解分。这一步做完你会发现自己以为「会了」的题其实有一半是蒙对的。3. SQL 大题实战从建表到多表查询的完整复现3.1 建表与约束先把地基打对数据库试题里的 SQL 大题通常会给一个业务场景让你建表、插数据、再查询。很多人直接跳到查询结果建表时主外键没设对后面连接全乱。我一般会先按题目描述把 ER 关系画在草稿纸上再落成CREATE TABLE。-- 学生表学号为主键姓名非空 CREATE TABLE student ( sno CHAR(8) PRIMARY KEY, sname VARCHAR(20) NOT NULL, sage INT CHECK (sage BETWEEN 15 AND 45), sdept VARCHAR(30) ); -- 课程表课程号为主键 CREATE TABLE course ( cno CHAR(4) PRIMARY KEY, cname VARCHAR(40) NOT NULL, credit DECIMAL(3,1) ); -- 选课表联合主键外键分别指向学生和课程 CREATE TABLE sc ( sno CHAR(8), cno CHAR(4), grade DECIMAL(4,1), PRIMARY KEY (sno, cno), FOREIGN KEY (sno) REFERENCES student(sno), FOREIGN KEY (cno) REFERENCES course(cno) );逻辑说明student和course是实体表sc是联系表用联合主键保证一个学生选同一门课只出现一次。参数上CHAR(8)对应学号定长VARCHAR用于变长字段CHECK约束年龄范围DECIMAL(4,1)能存到 999.9 分足够覆盖百分制带一位小数。外键不写ON DELETE CASCADE是常见考试默认因为题目没要求级联删除写了反而可能被判多此一举。3.2 多表连接与聚合把执行顺序想清楚建完表查询题一般会考「查每个学生的选课门数和平均分」这类聚合。写之前先想清楚先连接还是先过滤WHERE和HAVING谁先执行-- 查询每个学生的选课门数和平均分只显示选课超过 2 门的学生 SELECT s.sno, s.sname, COUNT(sc.cno) AS course_cnt, AVG(sc.grade) AS avg_grade FROM student s JOIN sc ON s.sno sc.sno GROUP BY s.sno, s.sname HAVING COUNT(sc.cno) 2 ORDER BY avg_grade DESC;逻辑说明JOIN先把学生和选课记录连起来GROUP BY按学生分组COUNT和AVG在组内计算HAVING对分组结果过滤最后排序。参数上COUNT(sc.cno)而不是COUNT(*)是因为要统计选课门数用具体列更准确GROUP BY里带上sname是为了兼容部分数据库的严格模式虽然sno已经能唯一确定sname。注意WHERE在分组前过滤行HAVING在分组后过滤组。如果把COUNT(sc.cno) 2写到WHERE里语法直接报错这是 SQL 大题最高频的翻车点之一。3.3 子查询与 EXISTS什么时候该换写法试题里另一类高频题是「查选了某门课的学生」或「查没选任何课的学生」。前者用IN或EXISTS都行后者必须用NOT EXISTS或左连接判空。-- 查询选修了「数据库」课程的学生姓名 SELECT sname FROM student WHERE sno IN ( SELECT sno FROM sc WHERE cno ( SELECT cno FROM course WHERE cname 数据库 ) ); -- 查询没有选修任何课程的学生 SELECT sname FROM student s WHERE NOT EXISTS ( SELECT 1 FROM sc WHERE sc.sno s.sno );逻辑说明第一个查询用嵌套IN从内到外依次定位课程号、选课学号、学生姓名。第二个用相关子查询NOT EXISTS对每个学生检查选课表里是否存在记录不存在就输出。参数上SELECT 1是EXISTS的惯用写法因为EXISTS只关心有没有行不关心列值写1比写*更明确。如果题目数据量大EXISTS通常比IN更稳因为IN在子查询结果集大时可能走全表扫描。考试里两种都算对但你要是能补一句「大数据量下优先EXISTS」简答题的分数就上去了。4. 理论题避坑范式、事务与索引的常见翻车点4.1 范式判定别把 3NF 和 BCNF 搞混范式题几乎每套卷子都有问法通常是「判断该关系模式属于第几范式并说明理由」。翻车最多的地方是把 3NF 和 BCNF 的条件记反。现象题目给一个关系模式你判断它是 3NF答案说是 BCNF。原因3NF 允许主属性对码的部分和传递依赖BCNF 要求所有函数依赖的左部都包含码。解决先找出所有候选码再逐条检查函数依赖。如果每条依赖的左部都是超码就是 BCNF如果存在左部不是码但右部是主属性的情况可能只到 3NF。我一般会按这个顺序写列出函数依赖 → 求候选码 → 判断每个依赖左部是否含码 → 下结论。步骤写全即使结论错过程分也能拿一半。4.2 事务隔离级别脏读、不可重复读、幻读的对应关系事务题常考「某隔离级别能避免哪些问题」。这张表必须背熟但背之前先理解为什么。隔离级别脏读不可重复读幻读读未提交可能可能可能读已提交避免可能可能可重复读避免避免可能串行化避免避免避免现象题目问「可重复读能否避免幻读」你答能结果错了。原因标准 SQL 里可重复读不保证避免幻读只有串行化才完全避免。解决记住「读已提交防脏读可重复读防不可重复读串行化全防」幻读是最后一道坎。部分数据库在可重复读下用间隙锁实现了防幻读但考试按标准答别把实现当标准。4.3 索引失效最左前缀与函数包裹索引题常给一条 SQL问「能否用到索引」。翻车点集中在两个最左前缀原则和列上做运算。现象WHERE YEAR(create_time) 2024用不到create_time上的索引。原因对索引列做了函数运算优化器无法直接定位。解决改成范围查询create_time 2024-01-01 AND create_time 2025-01-01。另一个现象联合索引(a, b, c)查询条件只有b和c用不到索引。原因最左前缀原则要求从最左列开始连续匹配。解决要么调整查询条件带上a要么重建索引顺序。这类题在简答里出现答「最左前缀」四个字就能拿分但最好补一句「范围查询会中断后续列的使用」。5. 用试题做自测错题归因与二轮复习的落地方法5.1 第一轮限时模拟暴露真实水平第一轮不要翻书按考试时间限时做。做完先别对答案用红笔把「不确定但蒙对」的题也标出来。这一步的目的是把「真会」「假会」「不会」分开。我一般会记录三个数总题数、确定对的、蒙对的。蒙对的比例超过 20%说明这套卷子的分数虚高复习要往蒙对的那些知识点上压。对答案时错题和蒙对的题一起进错题本。错题本不要抄题只写三样知识点标签、错因一句话、正确思路一句话。比如「3NF 判定 / 把主属性依赖当成传递依赖 / 先求候选码再逐条查左部」。5.2 第二轮按标签重做专攻高频错点第一轮结束后把错题本按标签汇总出现次数最多的三个标签就是第二轮的主攻方向。第二轮不按题号做按标签做——把同一标签下的所有题集中重做一遍做完立刻对答案看是否还在同一个地方翻车。如果某个标签连续两轮都错说明不是粗心是概念没通。这时候要回到教材对应小节把定义和例子重新推一遍而不是继续刷题。刷题只能巩固已懂的不能修复不懂的。5.3 第三轮只做 SQL 大题和设计题选择题和填空题在第二轮基本能覆盖第三轮把时间全留给 SQL 大题和设计题。这两类题分值高、步骤多需要手写练习。我一般会拿空白纸从建表开始默写写完再对照答案看每一步的得分点。设计题的重点是 ER 图转关系模式和范式分解。转关系模式时记住三条实体转表、联系转表或合并、多值属性单独转表。范式分解用投影分解法每一步都检查是否保持函数依赖和无损连接。这两条写清楚设计题基本不会低分。提示第三轮不要再看新题把手里这套试题的 SQL 大题反复写到能默写为止。一套卷子吃透比刷十套卷子每套只做一遍强。6. 从试题到考场一个可复用的复习节奏带过几轮复习之后我固定下来一个节奏考前第七天做结构统计和标签第五天完成第一轮限时模拟第三天按标签重做错题第二天专攻 SQL 和设计题考前一天只看错题本和范式、事务、索引三张表。这套节奏的核心不是刷多少题而是每一轮都有明确的输入和输出——第一轮输出错题本第二轮输出高频标签第三轮输出手写熟练度。有一个习惯我后来一直保留每道错题旁边写一句「下次遇到同类题我先做什么」。比如「先求候选码」「先看 WHERE 里有没有函数」「先确认 JOIN 类型」。这句话是给自己看的操作指令比「要认真」这种废话有用得多。考场上时间紧能条件反射地执行第一步后面的步骤就顺了。这套试题资源的价值不在于它押中多少题而在于它给了你一个可以反复跑的复习闭环。把它当成一份可执行的测试用例而不是一份答案册你的复习效率会完全不一样。希望帮到你。本文还有配套的精品资源点击获取