简介:这份文档是《数据库系统概论》第五版(王珊版)的课后习题参考答案,面向高校计算机及相关专业学生、考研复习者与数据库入门自学者,用于对照教材章节核对习题思路、巩固关系数据库基础理论。资源包共1个doc文件,约588KB,按教材章节组织答案,覆盖关系模型三要素、关系数据语言分类、实体完整性与参照完整性规则、关系代数五种基本运算及SQL语言特点等核心考点,并给出SPJ数据库的查询与建表语句示例,便于读者逐章对照教材复习、理解关系代数表达式与SQL语句的对应关系。目前已有1724人学习下载,适合课后作业核对、期末与考研查漏补缺时参考使用。
1. 数据库系统概论复习地图:从关系模型到范式设计的六章骨架
翻开这本教材的目录,很多人第一反应是"章节不多,背就完了",真正开始复习才发现坑在后面:关系代数里除运算和自然连接的符号长得像双胞胎,SQL 的NOT IN和NOT EXISTS写出来结果不一样,范式判断里"决定因素含不含码"绕得人头晕。这门课的知识其实是三层结构:底层是关系模型和完整性约束这套理论地基,中层是关系代数与 SQL 两种表达工具,上层是安全性、完整性、范式理论和数据库设计这些工程化内容。三层之间是递进关系,底层概念没吃透,上层题目就只能靠背答案。这份笔记按"理论地基—查询工具—控制机制—设计方法"的顺序把六章串成一张地图,适合正在系统学这门课、或者考前想快速查漏补缺的人对照着过一遍。
2. 关系模型地基:三个组成部分与完整性约束的复习重点
关系模型这一章看起来概念多,其实核心就一句话:关系模型 = 数据结构 + 操作集合 + 完整性约束。教材里所有题目,本质上都是在考这三块里的某一块。复习时先把这三块各自的内涵钉死,再去碰关系代数和 SQL,会顺很多。
2.1 三个组成部分各自管什么
关系数据结构回答"数据长什么样",就是二维表,行是元组、列是属性,这是最直观的一层。关系操作集合回答"能对数据做什么",包括选择、投影、连接、并、差、笛卡尔积这些运算,它们的特点是集合操作、非过程化——你只说"要什么",不说"怎么取"。关系完整性约束回答"数据必须满足什么规则",分实体完整性和参照完整性两大类。这三块不是并列的知识点,而是"存什么—怎么算—算得对不对"的链条,复习时按这个顺序理解,比孤立背定义有效得多。
关系数据语言按表达方式分三类:关系代数语言用运算符号表达查询,关系演算语言用谓词逻辑表达查询(又分元组演算和域演算),SQL 则兼具两者特点。它们的共同点值得单独记:表达能力完备、非过程化的集合操作、能嵌入高级语言。考试里问"关系数据语言的特点和分类",答全这三类加共同特点就够,别只写 SQL。
2.2 完整性约束:实体完整性与参照完整性的边界
实体完整性一句话:主属性不能取空值。参照完整性稍微绕一点:外码 F 的取值,要么全为空,要么等于被参照关系 S 中某个元组的主码值。这里最容易卡住的问题是"外码为什么可以为空"——因为外码属性本身不是主属性时,它代表"暂时还不知道对应哪个实体",语义上允许未知;一旦外码同时是主属性的一部分,就受实体完整性管,不能为空。判断能不能为空,就看 F 是不是主属性,这个判据要背到条件反射。
| 约束类型 | 约束对象 | 核心规则 | 空值处理 |
|---|---|---|---|
| 实体完整性 | 主码 | 主属性不能为空 | 一律不允许 |
| 参照完整性 | 外码 | 取空值或等于被参照主码值 | 外码非主属性时允许全空 |
| 用户定义完整性 | 具体属性 | 按语义自定义(如年龄≤60) | 视定义而定 |
2.3 关系代数:五个基本运算撑起全部
关系代数有五个基本运算:并、差、笛卡尔积、投影、选择。交、连接、除这三种都能用基本运算表达出来,这是常考的一句话。等值连接和自然连接的区别也要分清:等值连接用"="比较,从广义笛卡尔积里挑属性值相等的元组;自然连接是特殊的等值连接,要求比较的是同名属性组,并且结果里去掉重复列。自然连接"去重复列"这一点,是判断题目答案对不对的关键。
SPJ 数据库那组查询题是这一章的实战核心,值得反复练。比如"求供应工程 J1 零件为红色的供应商号码",思路是先选出 J1 的供应记录,再和零件表按零件号连接,筛出红色,最后投影出供应商号。除运算那题"至少用了 S1 所供应的全部零件",是典型的"包含全部"语义,用除法最直接。这类题翻车的常见原因是投影和连接的顺序搞反,或者忘了在连接前先做选择缩小范围。
3. SQL 语言实战:从建表到视图的查询与更新要点
SQL 这一章是整本书题量最大的部分,复习策略应该是"按语句类型分组练",而不是按题目顺序刷。建表、查询、更新、视图四类语句各有固定的套路和固定的坑,分组过一遍比零散做题效率高得多。
3.1 建表语句里的约束写法
建表时主码、外码、检查约束要写全。以职工和部门两个表为例,部门号做主码,职工表里部门号做外码参照部门表,年龄加一个CHECK约束:
CREATE TABLE DEPT ( Deptno NUMBER(2) PRIMARY KEY, -- 部门号为主码 Deptname VARCHAR(10), Manager VARCHAR(10), Phone CHAR(12) ); CREATE TABLE EMP ( Empno NUMBER(4) PRIMARY KEY, -- 职工号为主码 Ename VARCHAR(10), Age NUMBER(2) CHECK (Age <= 60), -- 用户定义完整性:年龄上限 Job VARCHAR(9), Sal NUMBER(7,2), Deptno NUMBER(2), FOREIGN KEY (Deptno) REFERENCES DEPT(Deptno) -- 参照完整性 );这段代码对应教材里完整性那一章的经典题。要注意CHECK约束属于用户定义完整性,FOREIGN KEY属于参照完整性,主码声明属于实体完整性,三类约束在一张表里同时出现,正好是完整性概念的具体化。写建表题时,UNIQUE和PRIMARY KEY别混用,主码自带唯一且非空,不需要再叠UNIQUE。
3.2 查询语句:连接、嵌套与"否定"语义
SQL 查询题的难点集中在两类:多表连接和带"没有""至少"这类否定或全称语义的嵌套。多表连接的关键是先想清楚涉及哪几张表、连接条件是什么、过滤条件放WHERE还是放连接里。比如"找出使用上海产零件的工程名称",需要 SPJ、S、J 三表连接,过滤条件是城市为上海,最后投影工程名。
否定语义是重灾区。"找出没有使用天津产零件的工程号",正确写法是用NOT IN套一个子查询,先查出用了天津零件的工程号集合,再取差:
SELECT DISTINCT JNO FROM SPJ WHERE JNO NOT IN ( SELECT DISTINCT SPJ.JNO FROM SPJ, S WHERE S.SNO = SPJ.SNO AND S.CITY = '天津' );这里有个血泪经验:如果写成WHERE S.CITY <> '天津'直接过滤,只有当每个工程号在结果里唯一时才碰巧对,一旦一个工程用了多个供应商的零件,就会把"用了天津零件但也用了别家零件"的工程错误地留下来。教材里专门标注了这两种写法的适用条件差异,复习时要把这个区别当成一个独立知识点记,而不是当成一道题的细节。
"至少用了 S1 所供应的全部零件"这类题,标准解法是除法,但很多环境不支持直接写除法,就拆成两步:先查出 S1 供应的零件集合,再找同时使用了这些零件的工程。拆步写法虽然啰嗦,但逻辑清晰、不容易错,考试时优先用。
3.3 更新语句与视图的可更新性
UPDATE、DELETE、INSERT三类语句本身不难,坑在级联影响。删除供应商记录时,要同时删除供应情况表里对应的记录,两条DELETE语句的顺序有讲究:先删参照关系(SPJ)还是先删被参照关系(S),取决于外码有没有定义级联删除。没定义级联时,先删被参照表会违反参照完整性报错,所以要先删子表记录。
视图部分要记牢两个判断:基本表的行列子集视图一般可更新;视图属性来自聚集函数或表达式时一定不可更新。原因是视图是虚表,更新最终要转换成对基本表的更新,而聚集函数的结果没法唯一地反推回基本表。这个"不能唯一有意义地转换"是标准答案的措辞,答题时用上。
| 视图类型 | 可更新性 | 原因 |
|---|---|---|
| 行列子集视图 | 一般可更新 | 与基本表行一一对应 |
| 含聚集函数的视图 | 不可更新 | 无法反推基本表更新 |
| 含表达式的视图 | 不可更新 | 属性值非直接存储 |
| 多表连接视图 | 通常不可更新 | 更新目标不唯一 |
4. 安全性与完整性:两套控制机制的对比复习
安全性和完整性经常被放在一起考,因为它们都是"约束数据"的机制,但防范对象完全不同。安全性防的是非法用户和非法操作,完整性防的是不合语义的数据。把这两条主线分开记,比混在一起背效率高。
4.1 安全性控制的五类方法
数据库安全性控制有五种常用方法:用户标识和鉴别、存取控制、视图机制、审计、数据加密。存取控制又分自主存取控制(DAC)和强制存取控制(MAC)。DAC 的核心是"谁能对哪个对象做什么",用GRANT和REVOKE实现;MAC 的核心是给主体发许可证级别、给客体标密级,只有许可证级别不低于密级的用户才能访问。
GRANT语句的考点集中在WITH GRANT OPTION和WITH ADMIN OPTION的区别:前者是把自己的权限转授给别人,后者是把角色授予别人。REVOKE的考点在CASCADE:收回权限时如果被转授过,加CASCADE会连锁收回。这两个子句是选择题和填空题的高频点。
-- 授予 U1 对两张表的全部权限,并允许其转授 GRANT ALL PRIVILEGES ON Student, Class TO U1 WITH GRANT OPTION; -- 收回 U1 的权限,并连锁收回其转授出去的权限 REVOKE ALL PRIVILEGES ON Student, Class FROM U1 CASCADE;审计功能的价值在于"事后追查":任何安全措施都不完美,审计日志能重现导致当前数据状态的一系列操作,找出非法存取的人、时间和内容。答题时把"重现事件序列"这个表述带上,比只写"记录操作"得分高。
4.2 完整性控制机制的三个功能
DBMS 的完整性控制机制有三个功能:定义、检查、违约反应。定义是提供约束条件的描述机制,检查是判断操作是否违背约束,违约反应是违背时采取的动作。参照完整性在实现时要考虑四个问题:外码能否为空、删除被参照元组时的策略(级联删除、受限删除、置空值删除)、插入参照元组时的策略(受限插入、递归插入)、修改主码的处理。这四个问题几乎每年都以简答或分析题形式出现,要能各举一例说清楚。
违反约束时的处理方式也有规律:违反实体完整性和用户定义完整性,一般直接拒绝执行;违反参照完整性则不一定拒绝,可能触发级联删除或置空值,具体看定义时选的策略。这个"不一定拒绝"是区分度很高的点。
5. 范式理论与数据库设计:函数依赖判断与 E-R 转换的易错点
范式理论和数据库设计是全书理论密度最高的两章,前者考推理,后者考建模。复习时把函数依赖的判断练熟,范式判断就是套定义;把 E-R 图到关系模式的转换规则记牢,设计题就是按流程走。
5.1 函数依赖与范式的判断链条
函数依赖的定义要抓住"任意两个元组在 X 上相等,则在 Y 上也相等"这个判据。完全函数依赖、部分函数依赖、传递依赖三个概念是范式判断的基础:1NF 要求分量不可再分;2NF 在 1NF 基础上消除非主属性对码的部分函数依赖;3NF 消除非主属性对码的传递函数依赖;BCNF 要求每个决定因素都包含码;4NF 处理非平凡多值依赖。
判断链条可以固定成三步:先找候选码,再看非主属性对码的依赖是完全还是部分,最后看有没有传递依赖。候选码的找法是找能推出全部属性、且自身不被其他属性推出的最小属性组。这一步练熟了,后面全是机械判断。
| 范式 | 核心条件 | 消除的问题 |
|---|---|---|
| 1NF | 分量不可再分 | 非原子属性 |
| 2NF | 非主属性完全依赖于码 | 部分函数依赖 |
| 3NF | 非主属性不传递依赖于码 | 传递函数依赖 |
| BCNF | 每个决定因素都含码 | 主属性对码的部分/传递依赖 |
| 4NF | 非平凡多值依赖的决定因素含码 | 非平凡多值依赖 |
教材里有个结论值得单独记:任何二目关系必定属于 BCNF。证明思路是二目关系只有两个属性,决定因素必然包含码,所以满足 BCNF 定义。这类"小结论"在判断题里出现频率很高,记住能省不少推导时间。
5.2 数据库设计的六阶段与 E-R 转换
数据库设计分六个阶段:需求分析、概念结构设计、逻辑结构设计、物理设计、实施、运行维护。三个阶段对应三级模式:概念设计产出 E-R 图(概念模式),逻辑设计把 E-R 图转成关系模型并建视图(逻辑模式加外模式),物理设计定存储和索引(内模式)。这个"阶段—模式"对应关系是简答题的标准框架。
概念结构设计有四种策略:自顶向下、自底向上、逐步扩张、混合策略。自底向上是先做局部 E-R 再集成,混合策略是用自顶向下的框架套自底向上的局部模型,实际项目里混合策略最常用。
E-R 图转关系模型的规则要背熟:每个实体转一个关系模式,实体的码就是关系的码;一对多联系可以合并到多端实体的关系里,也可以单独建关系;多对多联系必须单独建关系,码是两个实体码的组合;联系的属性跟着联系走。转换完还要检查每个关系模式是不是 BCNF,教材里那道学校概念模型的题,转换后各关系模式都只有一个码且是唯一决定因素,所以都是 BCNF,不会发生更新异常——这个"转换后验证范式"的收尾动作,很多人会漏。
6. 易错点清单:五类最容易翻车的判断与写法
复习到后期,拉开差距的不是会不会,而是细节记没记准。下面五条是梳理下来最容易错或漏的点,每条按"错在哪—为什么错—怎么补"整理。
易错点一:把"外码可以为空"当成无条件成立。漏的原因是只记住了参照完整性允许空值,忘了前提。补法是记住判据:外码属性本身不是主属性才能取空值,一旦外码是主属性的一部分,就受实体完整性管,不能为空。
易错点二:NOT IN和<>混用。漏的原因是觉得两种写法语义一样。补法是记住:NOT IN子查询适用于工程号唯一或不唯一的情况,直接<>过滤只适用于工程号唯一的情况,多供应商场景下会漏筛。做题时先问自己"这个实体在结果里会不会重复出现"。
易错点三:自然连接忘了去重复列。漏的原因是等值连接和自然连接的写法太像。补法是记一句话:自然连接 = 同名属性等值连接 + 结果去重复列,判断答案时先数结果关系的属性个数对不对。
易错点四:视图可更新性判断凭感觉。漏的原因是没有固定判据。补法是记两条硬规则:属性来自聚集函数或表达式,一定不可更新;行列子集视图一般可更新。其余情况按"能否唯一转换成基本表更新"来判断。
易错点五:范式判断跳过候选码直接看依赖。漏的原因是急着套 2NF、3NF 定义。补法是强制先找候选码,再判断非主属性对码的依赖类型,顺序不能反。候选码找错,后面全错。
提示:这五条建议单独抄在一页纸上,考前只看这一页,比重新翻教材效率高。
7. 考前查漏补缺:一份可执行的复习清单
复习到最后阶段,最有效的动作不是重新通读,而是按"题型—知识点—易错点"三列做一次自检。下面这份清单按章节组织,每行对应一个必须能独立复述或独立写出的内容,打勾之前先合上书默写一遍,写不出来就回去补那一节。
| 章节 | 必须能独立完成的事 | 对应易错点 |
|---|---|---|
| 关系模型 | 默写三个组成部分、完整性两条规则及空值判据 | 外码空值前提 |
| 关系代数 | 用五个基本运算表达交、连接、除;手写 SPJ 五道查询 | 自然连接去重列 |
| SQL | 建四张表并写全三类约束;写NOT IN否定查询;判断视图可更新性 | NOT IN与<>混用 |
| 安全性 | 写GRANT/REVOKE含两个选项;区分 DAC 与 MAC | 两个 OPTION 混淆 |
| 完整性 | 说出控制机制三功能、参照完整性四考虑 | 违约反应一律拒绝 |
| 范式理论 | 找候选码、判断 2NF 到 BCNF、证明二目关系属 BCNF | 跳过候选码 |
| 数据库设计 | 画 E-R 图、按规则转关系模式、验证范式 | 转换后不验证 |
具体执行上,我自己的习惯是分三轮:第一轮按章节过清单,只标"会/不会",不纠结;第二轮只攻标"不会"的项,每项找两道原题手写一遍,写完对照答案找差异,差异点记到易错点那页纸上;第三轮考前两天,只看易错点那页纸加这张清单,不再碰新题。这个流程的关键是第二轮必须手写,光看答案会产生"我会了"的错觉,真正下笔时GRANT的选项、CHECK的位置、除法的拆步,全是靠手写才记得住的。
还有一个小技巧:把 SPJ 那组查询题当成一个"母题"反复变式。同一组表,换一个条件就是一道新题,练到看到"没有使用""至少用了""全部"这些词就能条件反射地想到对应写法,SQL 这一章基本就稳了。范式判断同理,拿教材里那道系、学生、班级、学会的题反复练候选码和传递依赖,比刷十道零散题有用。
从那以后我每次复习这类理论课,都强制自己先合上书默写一遍知识地图,再对着清单逐项打勾,写不出来的地方才是真正要花时间的地方。希望这份梳理能帮到你,少走几段弯路。
本文还有配套的精品资源,点击获取