简介数据库系统概论第5版王珊版课后习题答案文档面向正在学习关系数据库理论的高校学生、考研备考生及需要核对课后作业的自学者。文件围绕教材核心章节展开重点解析第2章关系数据库与第3章关系数据库语言SQL涵盖关系模型三部分构成、关系数据语言分类、实体完整性与参照完整性规则、关系代数基本运算及其相互表达并结合SPJ数据库实例演示SQL查询、建表与嵌套子查询的具体写法。资源为doc格式共1个文件包体仅588KB便于下载后在电脑或手机上直接查看。该文档已吸引1723人浏览学习说明其在日常练习与考前复习中具有较高的参考价值。通过对照这些详细解答读者可以更快厘清关系模型与SQL语言的逻辑主线发现自己做题时的疏漏之处从而巩固数据库理论基础为后续数据库设计、应用开发等更深入的学习做好准备。1. 数据库系统概论第5版答案这份王珊版复习资料比你想的更耐读打开这份《数据库系统概论第5版答案王珊版》之前我以为它只是把课后题抄了一遍。真正逐题过完第2到第7章才发现标准答案之外最值钱的是两处一是围绕SPJ四表那一整套关系代数与SQL的对照拆解二是每道概念题对边界条件的强调——外码什么时候允许为空、视图为什么不能随便更新、NOT IN 和 在什么情况下结果不一样。对期末复习、考研二轮和刚入行的数据岗新人来说把它当带解析的题库用比当答案抄更有价值。下面按最容易丢分的模块展开。2. 关系模型与关系代数把SPJ四表查询这五类题型吃透2.1 关系模型的三段式与完整性规则关系模型由关系数据结构、关系操作集合和关系完整性约束三部分组成。数据结构负责“怎么存”操作集合负责“怎么查”完整性约束负责“存得对不对”。这三者的关系在判断题里经常被拆开考最常见的干扰项是把“安全性”混进“完整性”——完整性和安全性是两个概念完整性防的是不合语义的错误数据安全性防的是非法用户和非法操作两者有联系但不能互相替代。完整性规则里最绕的是参照完整性。实体完整性说主属性不能取空值而参照完整性允许外码取空值前提是这个外码本身不是主属性。很多人背完这两条就以为外码可以随意为空实际不然如果外码同时也是主属性比如复合主码里的一部分它就要一并受实体完整性约束为空会直接报错。书里的原话是“属性F本身不是主属性则可以取空值否则不能取空值”这个边界条件在考试里至少值一道简答题在业务表设计里也对应“先有主表记录再挂子表记录”的常规流程。2.2 五种基本运算与除法的推导路径关系代数的基本运算是并、差、笛卡尔积、投影和选择其他三种运算——交、连接、除——都可以由它们表达。交就是 A - (A - B)连接就是笛卡尔积加选择自然连接再额外去掉重复列除法是其中最抽象的运算也是期末考试区分度最高的考点。除法要理解的是语义“至少用了供应商 S1 供应的全部零件的工程号”翻译成关系代数就是 SPJ 投影出 (JNO, PNO) 再除以 S1 供应的零件号集合。考试时如果忘记除法的形式化写法可以用两步 SQL 绕过但关系代数题里必须写出 πJno, Pno(SPJ) ÷ πPno(σSnoS1(SPJ))。这里有个识别技巧题干出现“至少……全部……”“包含所有……”这类措辞时直接往除法上想不要用连接硬凑。2.3 SPJ四表查询逐题拆解第2章第6题给了一个经典SPJ数据库S是供应商表P是零件表J是工程表SPJ是供应关系表。这五道子题覆盖了选择、投影、连接、差和除法五种核心操作我按答案的顺序拆一遍1) 求供应工程J1零件的供应商号码SNO πSno(σJnoJ1(SPJ)) 2) 求供应工程J1零件P1的供应商号码SNO πSno(σJnoJ1∧PnoP1(SPJ)) 3) 求供应工程J1零件为红色的供应商号码SNO πSno(πSno,Pno(σJnoJ1(SPJ)) ∞ πPno(σColor红(P))) 4) 求没有使用天津供应商生产的红色零件的工程号JNO πJno(SPJ) - πJno(σCity天津∧Color红(S ∞ SPJ ∞ P)) 5) 求至少用了供应商S1所供应的全部零件的工程号JNO πJno,Pno(SPJ) ÷ πPno(σSnoS1(SPJ))前两题是单表上的选择和投影嵌套第三题开始需要连接先用 σJnoJ1(SPJ) 过滤供应记录再用 P 表按零件号做自然连接之后才能做颜色筛选。第四题的做法是“全集减子集”先从 SPJ 取出全部工程号减去使用了天津红色零件的工程号注意这里的 S∞SPJ∞P 三表连接要把供应商城市和零件颜色两个条件同时落上。第五题的除法要理解成“用 S1 的零件集合逐个校验每个工程的零件集合”这是这类题的标准套路。提示第四题的减法运算要求两边的投影属性集保持一致写成 πJno(SPJ) 和 πJno(...) 才能做差少了投影直接报类型不匹配。3. SQL语言实操建表、查询、更新与授权的完整SQL示范3.1 建表语句与标准SQL的差异第3章第4题要求用 SQL 建立 S、P、J、SPJ 四个表。答案原文写的是 C(2)、C(4)、C(6) 这类类型这是 Visual FoxPro 风格的字段记号不是标准 SQL 写法。如果你直接在 MySQL 或 PostgreSQL 里执行 CREATE TABLE S (Sno C(2) UNIQUE)会直接报语法错误。我按标准 SQL 整理如下-- 供应商表Sno 定长2字符UNIQUE 保证不重复 CREATE TABLE S ( Sno CHAR(2) UNIQUE, Sname VARCHAR(6), Status CHAR(2), City CHAR(4) ); -- 零件表Weight 用 INT 存数值 CREATE TABLE P ( Pno CHAR(2) UNIQUE, Pname VARCHAR(6), Color CHAR(2), Weight INT ); -- 工程表 CREATE TABLE J ( Jno CHAR(2) UNIQUE, Jname VARCHAR(8), City CHAR(4) ); -- 供应关系表三个外键QTY 为供应数量 CREATE TABLE SPJ ( Sno CHAR(2), Pno CHAR(2), Jno CHAR(2), QTY INT );这里有两个参数细节要说明一是 CHAR(n) 是定长字符串存不满会补空格比较时要注意隐式去空格VARCHAR(n) 是变长按实际长度存储一般业务字段优先用 VARCHAR。二是答案原题只写了 UNIQUE 约束没有显式写 PRIMARY KEY但在实际建表时 S.P.K.J 三张主表的 Sno、Pno、Jno 都应该定义为主键SPJ 表则应该用 (Sno, Pno, Jno) 做复合主键否则无法阻止重复的供应记录插入。3.2 SELECT查询NOT IN与的语义差异第3章第5题有一批针对四表的查询其中第7小问“找出没有使用天津产的零件的工程号码”在答案里特意标注了两种写法这个细节比题目本身更值得抄进笔记-- 正确写法NOT IN 子查询JNO 唯一或不唯一都成立 SELECT DIST JNO FROM SPJ WHERE JNO NOT IN ( SELECT DIST JNO FROM SPJ, S WHERE S.SNO SPJ.SNO AND S.CITY 天津 ); -- 容易翻车的写法 比较仅当 JNO 唯一时才正确 SELECT DIST JNO FROM SPJ, S WHERE S.SNO SPJ.SNO AND S.CITY 天津;为什么会有这个差别因为 写法是把 SPJ 与 S 连接后筛掉“天津”行但同一工程如果有两条供应记录一条来自天津供应商、一条来自上海供应商被筛掉天津行后工程 JNO 仍然会出现在结果里——它“有”来自天津的供应记录不应被判为“没有使用天津产的零件”。而 NOT IN 子查询先算出用过天津零件的工程集合再用 NOT IN 排除语义才是真正的“不属于这个集合”。我当时考数据库就是在这个点上丢的分后来凡是用 NOT IN 时都会先确认子查询返回的集合是否可能重复以及是否可能包含 NULL。3.3 视图建立视图与更新边界第3章第9题为三建工程项目建了一个供应情况视图 VSP包含供应商代码 SNO、零件代码 PNO、供应数量 QTY。视图在 SQL 里是一个虚拟表数据库只存它的定义不存它对应的数据数据仍然来自基本表-- 建立视图只保留 JNAME三建 的供应记录 CREATE VIEW VSP AS SELECT SNO, SPJ.PNO, QTY FROM SPJ, J WHERE SPJ.JNO J.JNO AND J.JNAME 三建; -- 查询三建工程使用的各种零件代码及数量 SELECT DIST PNO, QTY FROM VSP; -- 查询供应商 S1 的供应情况 SELECT DIST * FROM VSP WHERE SNO S1;这里要记两条边界。第一视图在概念上与基本表等同可以在视图上再定义视图但视图中的数据不物理存储每次查询都要去基本表实时取数性能上不能按物理表来预估。第二不是所有视图都可更新行列子集视图即从单个基本表按行和列的子集派生一般可更新视图属性来自聚合函数、表达式或多表连接的通常不可更新因为对这类视图的更新无法唯一且有意义地翻译成对基本表的更新。考试喜欢出“对 VSP 执行 UPDATE 是否合法”这类判断先看视图定义里是否出现 MAX、AVG、GROUP BY 或连接。3.4 GRANT与REVOKE授权语句的参数细节第4章的安全控制考点集中在 GRANT 和 REVOKE 上配套的用法包括 WITH GRANT OPTION、CASCADE 以及视图机制。下面几个示例覆盖了考试常见的授权粒度-- 用户王明对职工、部门两表有 SELECT 权 GRANT SELECT ON 职工, 部门 TO 王明; -- 用户刘星对职工表有 SELECT 权且能更新工资字段 GRANT SELECT, UPDATE(工资) ON 职工 TO 刘星; -- 用户周平拥有两表全部权限并可转授给其他用户 GRANT ALL PRIVILEGES ON 职工, 部门 TO 周平 WITH GRANT OPTION; -- 通过视图隐藏明细只暴露聚合结果给用户杨兰 CREATE VIEW 部门工资 AS SELECT 部门.名称, MAX(工资), MIN(工资), AVG(工资) FROM 职工, 部门 WHERE 职工.部门号 部门.部门号 GROUP BY 职工.部门号; GRANT SELECT ON 部门工资 TO 杨兰;UPDATE(工资) 这种列级授权是考试常考的细粒度写法它只开放工资列的更新权其他列即使有 SELECT 权也不能改。WITH GRANT OPTION 表示被授权人可以继续把权限转授给其他人对应的回收语句是 REVOKE ... ON ... FROM ... CASCADECASCADE 的作用是连锁回收——如果周平把权限转授给了别人回收时这些下游权限也会一并被收回。答案原文里有一处把 PRIVILEGES 拼成了 PRIVILIGES抄写时顺手纠正就行。4. 避坑指南范式题、视图更新与SQL方言差异的高发雷区4.1 理论雷区二目关系与视图更新避坑记录一判断“任何一个二目关系都属于 BCNF”时犹豫。现象题目问“任何一个二目关系是否属于 3NF/BCNF”我第一反应是找反例总觉着存在某种特殊函数依赖能让二目关系退化。原因把“二目”误当成“一个属性决定另一个属性的简单情况”忽略了二目关系总共只有 A→B 和 B→A 两种可能。解决按答案里的三段式证明走一遍——若 A→B 且 B 不决定 A码是 A若 B→A 且 A 不决定 B码是 B若 A、B 互相决定两个属性都是决定因素码是 (A,B) 或任一属性。三种情况决定因素都包含码所以二目关系必然是 BCNF也必然是 3NF以后这类判断题直接判对。避坑记录二对视图执行 UPDATE 报错但对应基本表明明可以更新。现象对 VSP 这类视图执行 UPDATE 或 INSERT数据库拒绝执行。原因视图定义里带有多表连接或者聚合表达式更新操作无法唯一映射回基本表。解决先看视图定义是否属于行列子集视图如果是多表连接视图尝试把更新拆分成多条针对基本表的语句如果属性来自 MAX、AVG、COUNT 这类聚合表达式直接放弃更新改为重新查询。判断顺序是先查定义再看类型最后决定拆解还是改写。4.2 实操雷区SQL方言与外码空值语义避坑记录三把答案里的 C(2) 直接粘到 MySQL 里执行建表直接语法报错。现象CREATE TABLE S (Sno C(2) UNIQUE) 在 MySQL 里报错提示类型附近有语法错误。原因《数据库系统概论第5版》的配套示例用的是 Visual FoxPro 环境C(n) 是 VFP 的字符类型记号标准 SQL 里没有这种写法。解决改成 CHAR(n) 或 VARCHAR(n)同时把 DIST 修正为 DISTINCT。顺手检查答案里对“S.E”这种带表前缀的写法是否与你用的数据库方言一致VFP 支持的部分语法在 MySQL、SQL Server 中表现不同。避坑记录四认为参照完整性里外码必须非空结果插入空外码失败后一脸茫然。现象插入一条外码为 NULL 的供应记录直觉上觉得违反了完整性约束不敢执行另一部分人恰恰相反认为外码可以随便为空。原因对“外码是否接受空值”没有区分主属性与非主属性。解决判断外码属性是否为所在关系的主属性——是主属性则受实体完整性约束必须非空不是主属性时空外码表示“联系未建立”系统允许这种情况。第5章第5题在 RDBMS 实现参照完整性时需要考量的四个方面——外码能否为空、删除被参照元组的动作级联/受限/置空、插入时的受限与递归处理、主码修改的限制——是期末简答的高频原题建议按四点列个口诀背。5. 把答案当复习提纲从课后题反推考点与答题模板这份答案最适合的用法不是“做完对答案”而是当复习提纲做考点反推。我整理了一张对照表每章只看答案里反复出现的概念就能判断考试大概率从哪里出题章节高频考点答案里的答题模板第2章 关系模型三组成部分、完整性规则、关系代数五运算按“结构→操作→约束”三段作答外码空值先判主属性第3章 SQL建表、连接查询、视图、授权先写 SELECT 再写 FROM/WHERENOT IN 优先于 第4章 安全性GRANT/REVOKE、视图机制、审计权限语句按“动作对象用户可选子句”拼装第5章 完整性三类约束、参照完整性实现违反实体/用户约束拒绝执行违反参照需按语义处理第6章 范式理论函数依赖、2NF/3NF/BCNF先找码再判断非主属性对码的依赖类型第7章 设计六阶段、E-R图转关系模型按“需求→概念→逻辑→物理→实施→运维”顺叙5.1 三步复现法把答案从“看过”变成“会写”第一步闭卷重做。只看习题题干不看答案严格限定时间。第2章的 SPJ 题和第3章 SQL 题限时30分钟写在纸上写不出来的标记为薄弱点。第二步对照答案做差异分析重点不是对错而是“我的思路和标准答案差在哪一步”——是没找到除法还是用成笛卡尔积还是忘记去重。第三步把写错的 SQL 和关系代数表达式抄进错题本在旁边注明错误原因考前只看错题本。我第一次考数据库期末就是栽在 NOT IN 与 的差异上从那以后每次复习都强制走完这三步再不看整本答案书只看自己抄过的那十几条翻车记录。希望帮到你。本文还有配套的精品资源点击获取