尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

数据库系统概论复习题指南:关系代数、SQL与范式分解的考点拆解

数据库系统概论复习题指南:关系代数、SQL与范式分解的考点拆解 简介一份可直接用于数据库系统概论期末复习与考研备考的试题合集浓缩了全书各章节核心考点。内容覆盖数据管理发展历程、数据库基本特点、DBMS功能、三级模式与两级映射、数据模型、完整性约束、并发控制与数据库恢复等核心主题如实体完整性、参照完整性等并以选择题、填空题、简答题形式呈现方便读者快速自测并对照答案查漏补缺。资源为单份PDF文档大小仅1.08MB下载后即可阅读适用于计算机相关专业学生、自考与考研人员也适合教师出题时参考。目前已有360人学习过该文件是经过实际使用验证的实用备考资料。完整版试题与答案整理在同一份PDF中章节结构清晰适合按章推进、逐题巩固可帮助系统梳理数据库理论体系、提升应试能力。1. 数据库系统概论的复习题不是拿来背的是拿来拆的数据库系统概论的复习题拿到手多数人第一反应是按章节往后刷刷到一半发现前面的题已经忘干净。问题不在题量在于这本教材王珊、萨师煊第六版是很多高校的指定教材的章节之间不是并列关系关系代数支撑SQLSQL支撑视图和完整性函数依赖支撑范式分解日志和封锁又建立在事务概念之上。完整版试题集的价值不是「做过一遍」而是用题目反推这条知识链上哪个环节断了。这篇博文按考试最常见的出题权重把各章复习题背后的考点、手算步骤和易错点拆开讲再给出一套限时自测方法适合正在备考期末、考研复试或数据库岗位笔试的读者。2. 关系模型与SQL复习从关系代数的运算边界到查询书写顺序2.1 数据库系统概论复习题里的关系代数选择和投影的先后不能乱关系代数的六种基本运算——选择、投影、连接、并、差、笛卡尔积——几乎覆盖了SQL表达能力的底层。复习题里最常见的判断题是「某个SQL查询与某条关系代数表达式是否等价」这类题没有捷径只能把每个子句映射到运算上WHERE对应选择SELECT列对应投影多表FROM对应连接或笛卡尔积。需要特别注意选择和投影的次序先选择再投影通常可行先投影再选择则会把选择条件需要的列丢掉表达式直接非法这是出题人最常埋的坑。举例说明设有关系模式 student(sno, sname, sdept, sage)查询「计算机系且年龄大于20的学生姓名」关系代数式是 π_sname(σ_sdeptCS ∧ sage20(student))。如果把 sname 先投影出来再做选择sdept 和 sage 已经不在关系里条件无从比较。复习时建议把教材上每一道关系代数题先手写一遍再对照SQL结果验证比直接背表达式有效得多。运算结果的属性顺序、重复元组是否保留这两个细节也常在填空题里出现。2.2 SQL查询题的书写顺序先连接、再过滤、后分组复习题里必考的一类SQL是「涉及三张表的查询」。最常见的错误是一上来就写WHERE把连接条件和大批过滤条件混在一起一旦出现LEFT JOIN就产生语义错误。我一般会强调固定的书写顺序先确定需要的表和连接键用JOIN把表连起来再写WHERE过滤行然后考虑GROUP BY分组和HAVING过滤组最后才是SELECT投影和ORDER BY排序。以「查询选过『数据库』课程的学生学号和姓名」为例SELECT s.sno, s.sname FROM student s JOIN sc ON s.sno sc.sno JOIN course c ON sc.cno c.cno WHERE c.cname 数据库;这段SQL里sc是选课关系sno是学号cno是课程号cname是课程名。先连接两层的逻辑在于sc表是student和course之间的桥梁不先把桥梁搭好后续任何过滤条件都无法在两个表之间定位。WHERE里写课程名而不是课程号是为了展示连接条件与过滤条件分离的写法如果题目给的是cnoC01过滤条件就变成 WHERE sc.cno C01写法同理。再看「查询每门课程的选课人数」这种聚合题关键是先分组再数数SELECT c.cno, c.cname, COUNT(sc.sno) AS stu_cnt FROM course c LEFT JOIN sc ON c.cno sc.cno GROUP BY c.cno, c.cname;这里用LEFT JOIN而不是INNER JOIN原因是没有学生选的课程也要出现在结果里选课人数显示为0。COUNT(sc.sno)会自动忽略NULL值恰好统计非空选课记录如果改用COUNT(*)没学生选的课程会数出1行语义就错了。GROUP BY后面必须同时列出cno和cname因为SELECT里的非聚合列必须出现在分组列中否则在只开了ONLY_FULL_GROUP_BY的MySQL或标准SQL环境下直接报错。若题目要求只显示选课人数大于10的课程过滤条件要写在HAVING里而不是WHERE里HAVING是在分组完成后对组施加条件WHERE则是在分组前过滤行。2.3 空值与集合运算三个每年都有人丢分的点第一个点是IS NULL与 NULL的区别。SQL里NULL不等于任何值包括它自己所以年龄为空必须写成sage IS NULL。第二个点是聚合函数对NULL的忽略行为COUNT(*)统计所有行COUNT(sage)只统计sage非空的行AVG和SUM同样先剔除NULL再计算。第三个点是NOT IN子查询结果含NULL时的整体失效查询结果会变成空集这是复习题里出现频率极高的陷阱。三个点可以压成一张自查表贴在复习资料第一页场景错误写法正确写法结果差异判断空值sage NULLsage IS NULL 永远返回未知查不到行统计行数COUNT(sage)COUNT(*) 或 COUNT(sno)NULL行被忽略数字偏小排除子集sno NOT IN (子查询)子查询内过滤掉 NULL子查询含NULL时整体结果为空提示NOT IN的空值陷阱在第六版教材的例题和不少高校的历年考题里都出现过考试时看到NOT IN先扫一眼子查询的目标列是否可能出现NULL出现就改写成NOT EXISTS。3. 完整性、安全性与视图复习概念题里真正拉分的部分3.1 数据库系统概论的三类完整性约束定义与违约处理数据库系统概论把完整性分成实体完整性、参照完整性和用户定义完整性三层。复习题多以「指出某条约束属于哪一类」和「违约时系统做什么」两种形式出现。实体完整性约束主码非空且唯一违约时系统拒绝插入或修改参照完整性约束外码取值要么为空、要么等于被参照表的主码值违约时的处理由ON DELETE和ON UPDATE子句决定常见选项是CASCADE、SET NULL和默认拒绝。三类约束的对比是填空题的重灾区完整性类别约束对象违约时系统行为实现语句实体完整性主码属性拒绝插入或修改PRIMARY KEY参照完整性外码属性CASCADE / SET NULL / 拒绝操作FOREIGN KEY ... ON DELETE用户定义完整性列取值范围拒绝违反语义的操作CHECK、NOT NULL、UNIQUE对应的建表语句是复习题里最能体现完整性的组合CREATE TABLE sc ( sno CHAR(9), cno CHAR(4), grade SMALLINT, PRIMARY KEY (sno, cno), FOREIGN KEY (sno) REFERENCES student(sno) ON DELETE CASCADE, FOREIGN KEY (cno) REFERENCES course(cno) ON DELETE CASCADE, CHECK (grade IS NULL OR (grade BETWEEN 0 AND 100)) );主码(sno, cno)体现实体完整性两个外码体现参照完整性CHECK约束实现用户定义完整性一道题考三种约束是很常见的组卷方式。ON DELETE CASCADE的语义是删除学生时自动删除该学生的选课记录如果改成SET NULL则保留选课记录但把sno置为空。复习时把CASCADE、SET NULL、NO ACTION三个行为的差异写清楚判断违约处理结果的选择题基本不会再错。注意这里的CHECK允许grade为空因为空成绩在语义上表示「未考试」这是出题人喜欢挖的边界。3.2 GRANT与REVOKE的授权链WITH GRANT OPTION决定回收方式安全性章节的复习题集中在自主存取控制核心是GRANT和REVOKE两条语句的语义。授权语句的细节比看起来多WITH GRANT OPTION表示被授权人可以再把这个权限转授给其他人后续REVOKE时必须带CASCADE或RESTRICT否则回收语句会执行失败。CASCADE会递归回收所有由该授权衍生的权限RESTRICT则要求当前不存在依赖该权限的其他授权才允许回收否则拒绝执行。看下面这组配对-- 授予用户 u1 对 student 表的查询和插入权限允许 u1 继续转授 GRANT SELECT, INSERT ON student TO u1 WITH GRANT OPTION; -- u1 把权限转授给了 u2此时回收必须级联u2 的权限也随之失效 REVOKE SELECT, INSERT ON student FROM u1 CASCADE;第一个语句中的权限清单是SELECT和INSERT两个操作对象是student表目标用户是u1最后的WITH GRANT OPTION是关键参数它决定了u1有再授权的资格。第二条回收语句里的CASCADE则决定了回收的传播范围。如果回收语句写的是RESTRICT而u2当前还持有从u1继承的权限数据库会直接拒绝回收。复习题经常在这一步设迷惑项答题前先画授权树从根用户到叶子用户标出每条边的授权来源再判断级联路径正确率会明显提高。安全性章节里还有一个常考点是数据库角色角色是一组权限的集合用角色授权可以简化权限管理判断题里「角色只能赋给用户不能赋给其他角色」这句话是错误的角色之间可以嵌套。3.3 视图的更新限制为什么「行列子集视图可更新」是特例视图章节的复习题里判断「某个视图能否更新」属于高频题。教材给出的规则是行列子集视图——即仅由单表选择、投影得到的视图——可以更新凡是带GROUP BY、聚合函数、DISTINCT、表达式列或两表以上连接的视图更新操作会被系统拒绝或语义不明。原因在于视图中有些行无法唯一映射回基表的某一行系统无法决定UPDATE或DELETE的目标。这个判断标准比背规则列表更可靠CREATE VIEW cs_student AS SELECT sno, sname, sage FROM student WHERE sdept CS; -- 这个视图可以执行 INSERT系统把视图定义里的 sdeptCS 补进基表 INSERT INTO cs_student(sno, sname, sage) VALUES (2024001, 张三, 20); CREATE VIEW avg_grade AS SELECT cno, AVG(grade) AS avg_g FROM sc GROUP BY cno; -- 这个视图不可更新avg_g 是聚合结果没有对应的基表列可写回 UPDATE avg_grade SET avg_g 90 WHERE cno C001; -- 非法第一个视图cs_student是典型的行列子集视图INSERT时系统把视图定义中的固定条件sdeptCS自动补进基表。第二个视图avg_grade的avg_g来自AVG聚合UPDATE要改的值在基表里根本没有对应列自然非法。更隐蔽的考点是在视图定义末尾加WITH CHECK OPTION加了之后对视图的插入和修改必须满足视图定义里的条件比如向cs_student插入sdeptMA的行会被拒绝。复习时记住一条主线视图的可更新性取决于「行到基表的映射是否唯一」聚合、分组、连接、表达式都会破坏这种唯一性。4. 函数依赖与范式分解复习从闭包计算到无损分解判定4.1 属性闭包的手算方法迭代到不动点为止关系数据理论章节的复习题是所有章节里最需要动手的。函数依赖、候选码、范式判定、模式分解环环相扣。第一步把属性闭包练熟给定关系R的属性集U和函数依赖集F要判断某个属性组A是否是候选码就计算A的闭包A⁺看能否覆盖全部属性。计算规则是迭代从A出发凡是函数依赖的左侧能被子集包含就把右侧的属性并进来重复直到集合不再增长。举例R(U, F)U{A, B, C, D}F{A→B, AB→C, C→D}求A的闭包。初始集合是{A}A→B把B带进来集合变成{A, B}AB→C把C带进来集合变成{A, B, C}C→D把D带进来集合变成{A, B, C, D}覆盖全部属性所以A是候选码。可以用很短一段脚本验证手算结果def closure(attrs, fds): result set(attrs) while True: old set(result) for lhs, rhs in fds: if set(lhs).issubset(result): result | set(rhs) if result old: return result fds [(A, B), (AB, C), (C, D)] print(sorted(closure(A, fds))) # [A, B, C, D]脚本里closure函数的第一个参数attrs是初始属性集合第二个参数fds是函数依赖列表每个依赖用二元组表示lhs是决定因素rhs是被决定属性。循环内每次扫描全部依赖只要左侧属性已经落在结果集里就把右侧并入直到一轮扫描后集合不再变化这个条件就是闭包计算的终止条件。复习时先用脚本验算两三道题确认思路对了再改成纯手算速度快很多。考场不能带脚本手算时注意每轮扫描必须完整走完所有依赖不能扫到一半就停。求候选码还有一条经验规则只在函数依赖左侧出现、从未在右侧出现的属性必然属于任何候选码先找这类属性再逐步补充其他属性验证闭包比穷举快得多。4.2 范式判定与无损分解两步检查对应一道大题判定关系模式属于第几范式是复习题的大题常客。标准流程是先求候选码再看是否存在非主属性对候选码的部分依赖违反2NF、传递依赖违反3NF以及是否所有决定因素都是候选码BCNF。判定标准浓缩成一张表范式必须满足的条件判定时问的问题1NF属性不可再分有没有多值属性或复合属性2NF1NF 非主属性完全函数依赖候选码是否存在对候选码的部分依赖3NF2NF 非主属性不传递依赖候选码是否存在非主属性间的传递依赖BCNF每个决定因素都包含候选码是否有非候选码属性决定其他属性分解题在此基础上加一道「判断分解是否无损」的检查。最常用的判断思路是把原关系里的每个函数依赖对照分解后的关系模式逐一核验如果某个函数依赖的左右两侧属性完全落在同一个分解关系中或者两个分解关系的公共属性是其中一个的候选码则该分解在这个依赖上无损。全部依赖核验通过分解就是无损的。复习题答案里常写的「逐一检查每个函数依赖是否被某个分解关系包含」就是这个意思比背公式可靠。4.3 从ER图到关系模式数据库设计题的考点分布数据库设计章节的复习题通常给一段业务描述要求画ER图再转关系模式。ER图转关系模式的规则要复述清楚实体转成关系实体的属性转成关系的属性实体的码就是关系的码1:1联系可以并入任意一端1:n联系并入n端m:n联系必须单独成一个关系属性是两端实体码的并集加上联系自身的属性。复习题里最容易丢分的地方是漏掉联系自身属性比如「选课」联系的grade必须出现在选课关系中而不是出现在student或course里。这一章的复习策略与其他章不同不需要做太多题把教材里两三个典型ER图例题反复画三遍比做十道新题更有效。每次重画都会发现之前遗漏的实体属性或联系基数标注错误这些恰恰是考试阅卷按点扣分的地方。画图时顺手标注每个实体的主码和外码转关系模式时不会乱。还有一类选择题考设计步骤的次序需求分析、概念结构设计、逻辑结构设计、物理结构设计这四个阶段的产出物分别是什么复习时把每个阶段的输入输出列一遍这类送分题就不该丢。5. 用限时模拟考反向定位复习漏洞5.1 时间分配按真实考试节奏压缩复习到后期整套限时模拟比逐章刷题更有效。取一套历年真题或试题集中的综合卷按真实考试时长打七折限时把各部分用时限死选择题和填空题用总时长的四分之一关系代数和SQL题留三分之一范式分解和设计题留三分之一剩下的时间全部留给事务、并发和恢复题。超时的题一律先跳过做完再回看这个动作本身就是在训练考场的取舍能力。模拟时旁边放一张草稿纸每做完一道题在纸上记下实际耗时整套做完后对比预期时长偏差最大的题型就是需要单独加练的部分。5.2 错题归因表把错误映射回教材章节每做完一套题把错题填进归因表右侧直接对照第六版教材的章节号。连续两套卷在同一个章节号下出错超过三次说明问题不是粗心而是该章的概念链断了。这时候回看对应章节的原文只看定义和例题不再刷题。错题归因表示例题号错误类型涉及考点回看书章节3空值陷阱NOT IN 与 NULL 的语义第3章 关系数据库标准语言SQL14判断错误3NF 与 BCNF 的边界第6章 关系数据理论23概念混淆隔离级别与封锁协议第11章 并发控制归因表的价值不在记录本身而在每周对比错题数量的分布变化。当某一行的同类错误连续两次不再出现说明漏洞补上了如果某一行的错误反复出现需要换一种学习方式比如把该章的概念画成一张从定义出发的推理图而不是继续做题。下一套卷子开做之前先花十分钟把归因表里出现超过两次的考点抄到草稿纸顶部做完对照检查一遍这个动作本身就能让同类错题率明显下降。本文还有配套的精品资源点击获取
返回列表