news 2026/10/22 6:43:19

数据库入门避坑指南:关系模型、SQL与E-R图设计核心要点

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
数据库入门避坑指南:关系模型、SQL与E-R图设计核心要点

简介:《数据库系统概论》第5版(王珊版)课后习题答案doc文档,面向数据库初学者、高校本科生及考研复习者,用于对照教材习题巩固关系数据库核心理论。包内含1个doc文档,文件大小仅588KB,采用通用Word格式,便于在电脑、平板或手机上阅读、打印及二次整理。内容覆盖第2章关系数据库与第3章SQL语言等重点章节,逐题给出完整解答,涵盖关系模型三部分、关系数据语言特点与分类、实体完整性与参照完整性规则、关系代数基本运算及其相互表达,以及SQL建表与多表查询。针对课后典型习题提供详细推导和SQL语句示例,如求解“求供应工程J1零件的供应商号码”等经典题目时,既给出关系代数表达式,也给出等价SELECT写法,能帮助读者理解概念到实际操作的衔接。目前已有1723人学习下载,适合数据库课程期末复习、考研专业课备战及日常自学自测使用。

1. 先搞懂一件事:数据库入门到底在学什么

很多零基础的同学第一次翻开《数据库系统概论》第五版时,脑子里只有一个问题:数据库不就是存数据的吗,为什么还要学一整本书?说实话,这个疑问非常正常。你可以把数据库理解成一个超级仓库,它不只是把数据堆进去,还要保证数据不乱、不丢、不冲突,并且能让很多人同时安全地取用。我们学数据库,学的是这套仓库的“管理规则”——怎么组织数据、怎么查询数据、怎么保证数据不出错。这门课是计算机相关专业的必修基础,也是后端开发、数据分析、运维岗位面试必考的内容。如果你将来想写代码、做系统、处理数据,数据库就是绕不开的第一块地基。

2. 为什么要学数据库:从一张 Excel 表说起

2.1 为什么数据不能放在 Excel 里:规模、并发、安全

你可能用过 Excel 存成绩单、记账本。数据少的时候,Excel 很方便,但一旦数据量到几十万条,同时有几十个人要读写,问题就来了:文件被谁打开了?会不会有人改错?怎么保证两个人同时改不冲突?怎么设置每个人只能看一部分数据?Excel 很难回答这些问题。数据库系统就是来解决这些问题的专业工具,它能把数据集中管理,提供高效的查询、严格的控制和并发处理能力。

教材第一章到第七章讲的,本质上就是这套管理规则。完全不夸张地说,理解了数据库为什么存在,你后面学关系模型、SQL、完整性约束时就会觉得每一步都有意义。

2.2 数据库系统这门课到底教什么:三大块内容地图

我把这本教材的内容拆成三大块,你心里先装下这张地图,学起来就不会迷路。

第一块是“模型与语言”。关系模型是数据库的骨架,它规定了数据长什么样、怎么组织;关系代数和 SQL 是操作数据的手段。第二块是“保护机制”。包括安全性(防止坏人搞破坏)和完整性(防止错误数据入库存)。第三块是“设计方法”。也就是拿到一个现实问题,怎么设计出一套合理的数据库表结构,这部分主要对应第七章的数据库设计。

这三块层层递进:先懂模型,再学会用语言操作,然后学会保护数据,最后学会设计一整套系统。教材后面的章节答案,基本就是围绕这三块展开的。

2.3 关系模型:数据库世界的第一块基石

教材第二章开篇就问了关系模型的三个组成部分,这是全书最重要的概念之一。我用大白话给你翻译一下:

关系数据结构,就是“二维表”——行和列组成的表格,每一行是一条记录,每一列是一个属性;关系操作集合,就是你能对表做的事情,比如查某些行、某些列、把两张表拼起来;关系完整性约束,就是表的规矩,比如“主键不能为空”“外键要么为空,要么必须指向真实存在的记录”。

这里有一个新手最容易忽略的点:关系模型为什么用“关系”这个词?因为在数学上,一张表就是一个关系。你不需要深究数学定义,只要记住:以后看到“关系”,脑子里就把它想成一张表。后面学关系代数、范式,全是在这张表的基础上做文章。

3. 第一步先学会读答案:关系代数和 SQL 怎么配着看

3.1 关系代数五种基本运算:并、差、笛卡尔积、投影、选择

很多同学第一次看到关系代数就发怵,满屏的希腊字母和符号。其实它就像一套“操作表格的运算符”。教材里反复强调五种基本运算:并、差、笛卡尔积、投影和选择。其他运算,比如交、连接、除,都能用这五种组合出来。

  • 并:把两张表的行合并,重复的行只留一次。
  • 差:从第一张表里去掉第二张表也有的行。
  • 笛卡尔积:把两张表的每一行都互相拼一遍,得到一张大表。
  • 投影:只留下你想要的列,相当于“竖着切”。
  • 选择:只留下符合条件的行,相当于“横着切”。

比如“找出供应工程 J1 零件的供应商号码”,答案写成πSno(σJno='J1'(SPJ)),翻译过来就是:先对 SPJ 表做选择,只留下 Jno 等于 J1 的行;再对结果做投影,只留下 Sno 这一列。你看,一点都不神秘。

3.2 用 SQL 把关系代数写出来:第一个可跟做的例子

SQL 是更贴近实际使用的语言。教材第三章的答案里,很多查询既给了关系代数,又给了 SQL。我建议你学的时候把两者对照着看:关系代数是“思路”,SQL 是“写法”。

我带你跑一个最经典的例子。假设有 SPJ 表,里面有供应工程 J1 零件的供应商号码。SQL 可以这样写:

SELECT DISTINCT SNO FROM SPJ WHERE JNO = 'J1';

这段代码的意思非常直白:SELECT DISTINCT SNO表示要查询不重复的供应商号码,FROM SPJ表示从 SPJ 表里查,WHERE JNO = 'J1'表示只筛选工程代号为 J1 的行。DISTINCT是“去重”,因为同一个供应商可能供了好几个零件,但我们只要号码列表。

再看一个复杂一点的:求供应工程 J1 零件为红色的供应商号码。这时候需要把 SPJ 表和 P 表连接起来,因为颜色信息存在 P 表里。SQL 写法如下:

SELECT SNO FROM SPJ, P WHERE JNO = 'J1' AND SPJ.PNO = P.PNO AND COLOR = '红';

这里的关键是SPJ.PNO = P.PNO,它把两张表通过零件编号关联起来。你可以这样理解:先把 SPJ 的每一行和 P 的每一行配对,然后筛选出工程是 J1、零件编号相等、颜色是红的行,最后取出供应商号码。这就是关系代数里的连接运算在 SQL 中的体现。

3.3 手把手拆解一道 SPJ 数据库真题

教材第二章第 6 题给了个很经典的库:S(供应商)、P(零件)、J(工程)、SPJ(供应关系)。我建议你把这道题当作练手入口,因为它覆盖了选择、投影、连接、差、除几乎所有运算。

比如“求没有使用天津供应商生产的红色零件的工程号 JNO”,答案思路是:先找出使用了天津供应商红色零件的工程号,然后从全部工程号里减去这些。SQL 可以分成两步写:

-- 第一步:找出使用了天津供应商红色零件的工程号 SELECT DISTINCT JNO FROM SPJ, S, P WHERE S.CITY = '天津' AND COLOR = '红' AND S.SNO = SPJ.SNO AND P.PNO = SPJ.PNO;
-- 第二步:从所有工程号中排除第一步的结果 SELECT DISTINCT JNO FROM SPJ WHERE JNO NOT IN ( SELECT DISTINCT JNO FROM SPJ, S, P WHERE S.CITY = '天津' AND COLOR = '红' AND S.SNO = SPJ.SNO AND P.PNO = SPJ.PNO );

注意第二步的NOT IN,它的意思是“不包含在子查询结果里”。这是一种非常常用的排除写法。实际写的时候,你可能会发现有些教材用的 VFP 环境不支持太深的子查询嵌套,这时候可以把第一步的结果先记下来,再手动去第二步里排除。这也是为什么教材答案里经常把查询拆成两步的原因。

4. 入门最容易踩的坑:数据库学习避坑指南

4.1 坑一:死记 SQL 语句,却不知道每一步在操作哪张表

现象:能把SELECT、INSERT、UPDATE背得滚瓜烂熟,但题目一换成没见过的表,就不知道怎么写。

原因:你把 SQL 当英语背了,没有理解它背后的操作对象。数据是存在表里的,写任何查询都要先问自己:我要的数据在哪些表里?表之间怎么关联?

解决:拿到题目先画表,把表名列出来,再写 SELECT。每次写完 SQL,心里默念一遍“先找表,再筛选行,再投影列”这个顺序。我学的时候,会把教材第二章的 SPJ 那四张表抄在纸上,做题时对着纸写,坚持半个月就顺畅了。

4.2 坑二:搞不清外码为什么可以为空

现象:学参照完整性时,死活想不明白,既然外码要参照主码,为什么外码的值还可以是空?

原因:你没有分清“外码属性”和“主属性”的区别。题干里说得很清楚:如果外码属性本身不是主属性,就可以取空值;如果它同时是主属性的一部分,就不能为空。

解决:记住一句话:空值代表“还没确定”,但主键必须唯一且非空。比如选课表(学号,课程号,成绩),学号和课程号共同组成主码,这时学号同时也是外码,就不能为空,因为成绩必须对应一个真实存在的学生。但如果你有一张“员工表”,里面有个“部门号”外码,员工还没分配部门时,部门号可以为空。做题时先判断这个外码是不是主属性,再决定允不允许空。

4.3 坑三:把视图当成一张真实存在的表

现象:认为视图里存了数据,修改视图就是在改视图本身,结果老是想“视图为什么不能更新”。

原因:教材里反复强调,视图是虚表,它不存储数据,只是保存了一条查询定义。你查视图时,数据库其实是在执行视图背后的那条 SELECT 语句,去真实表里取数。

解决:你只要记住:视图是一副“眼镜”,戴上它只能看到基本表的某一部分。如果视图的某一列是从集合函数(MAX、AVG、COUNT)或者表达式算出来的,那这一列就没有办法反向更新到原始表,所以整个视图不可更新。比如“部门工资”视图里有最高工资、最低工资、平均工资,这些值不是你改就能改回去的,所以这种视图不能直接修改。做题时先看视图定义里有没有函数或计算,有就判断不可更新。

4.4 坑四:把完整性和安全性混为一谈

现象:看到“数据库的安全性”和“数据库的完整性”两个章节,觉得都在保护数据,做题时问“防止脏数据”该选哪个,就懵了。

原因:安全性和完整性的防范对象不一样。安全性防的是“人”,是非法用户和非法操作,比如有人偷看数据、越权修改;完整性防的是“数据”,是不合语义的脏数据,比如年龄写成 200 岁、学号重复。

解决:一句话记忆:安全性管“谁能不能碰”,完整性管“数据本身合不合理”。GRANT 授权、视图加密、审计日志,都是安全性;主码非空、外码约束、CHECK 年龄小于 60,都是完整性。做题时先判断题目是在说“权限”还是“内容”,再选对应的控制手段。

4.5 坑五:做数据库设计题时跳过需求分析

现象:拿到 E-R 图题目,直接开始画实体画连线,结果一画就错,漏掉联系属性,比如选修的“成绩”。

原因:你跳过了需求分析这一步,没有把题目里的每句话拆成“实体、属性、联系”。比如“每个学生选修若干课程,每门课可由若干学生选修”这句话,本身就决定了学生和课程是多对多联系,成绩是联系属性。

解决:严格按照教材第七章的设计步骤来。第一步先把题目的名词找出来当实体,把动词找出来当联系;第二步确认每个实体的属性,特别留意修饰性短语;第三步再画 E-R 图。我第一次画错,就是因为把“成绩”当成了课程的属性,后来发现它属于“选修”这个联系。记住这个顺序,能少踩一半的坑。

5. 数据库设计的六个阶段:从需求分析到运行维护

5.1 六个阶段分别是什么

教材第七章把数据库设计分成六个阶段:需求分析、概念结构设计、逻辑结构设计、物理设计、实施、运行和维护。这六个阶段是一个完整的生命周期。你不需要背,用类比来理解:你想开一家店,需求分析是“弄清楚要卖什么、顾客是谁”;概念结构设计是“画一张店里的布局草图,不关心用什么材料”;逻辑结构设计是“决定用货架还是柜台”;物理设计是“货架摆在哪、哪个位置放高频商品”;实施是“真的开店”;运行维护是“每天营业、补货、调整”。

在入门阶段,你要重点抓住前三个阶段。需求分析决定了你的模型对不对,概念设计产出 E-R 图,逻辑设计把 E-R 图变成关系表。后面三个阶段更偏工程实践,初学只要知道大概流程即可。

5.2 用 E-R 图设计概念模型:从零画一张学校选课模型

很多同学对画 E-R 图特别头疼,总觉得无从上手。其实步骤非常固定。我以教材里的学校模型为例,带你来一遍。

题目说:学校里有若干系,每个系有若干班级和教研室,每个教研室有若干教员,教员带研究生;每个班有若干学生,每个学生选修若干课程。

我们先提取实体:系、班级、教研室、教员、学生、课程。再提取属性和联系。比如系的属性有系编号、系名;学生的属性有学号、姓名、学历。联系有几组:系和班级是“1 对 N”,系和教研室是“1 对 N”,教研室和教员是“1 对 N”,教员和学生是“1 对 N”(教授带研究生),学生和课程是“M 对 N”,并且“选修”联系有一个属性叫成绩。

最终转换成关系模式时,你只要把这些实体和联系变成表。实体变表,1 对多的联系可以把“一”方的主码加到“多”方表中作为外码;M 对多的联系单独变成一张表,联系属性也放进这张表。比如学生和课程的多对多就转成“选修(学号,课程号,成绩)”。

这一步如果你能自己动手把 E-R 图画出来,再转成关系模式,教材第七章的很多题你就已经吃透了。

5.3 逻辑结构设计:E-R 图怎么变成关系表

逻辑结构设计就是把概念模型转换成具体数据库支持的表结构。核心就一句话:实体变表,联系变表或外码。

我给你一个可操作的方法:拿到 E-R 图,对于每个实体,创建一个关系模式,实体属性作为列,实体的码作为主码;对于 1 对 1 联系,可以把任一方的主码加到另一方作为外码;对于 1 对 N 联系,把“一”方的主码加到“多”方作为外码;对于 M 对 N 联系,新建一张关系表,包含两个实体的主码以及联系自身属性,主码通常是两个外码的组合。

教材里那道“产品、零件、原材料、仓库”的题就是非常标准的例子。产品组成联系有“使用零件量”属性,所以单独建一张“产品组成(产品号,零件号,使用零件量)”。这一段练熟,你就掌握了关系数据库设计的核心基本功。

6. 下一步学什么:把这份答案变成你的学习路线图

这份答案文档不是用来背的,它是你的“对照检查表”。我建议你按下面这个路线来用:

第一步,先自己写一遍再对答案。每道查询题,先不看答案,在纸上写 SQL 或关系代数,然后打开文档对照。做错的题,用红笔标出你是错在“选错表”还是“漏条件”。第二步,把概念题当成面试题来回答。比如“什么是视图?哪些视图可更新?”,你合上文档,自己用大白话讲一遍,讲得出来说明真懂了。第三步,把 SPJ 数据库当作练习环境,把文档里所有涉及 SPJ 的查询题都手敲一遍。没有一个数据库环境,可以安装一个轻量的 MySQL 或者用在线 SQL 练习平台,亲手把代码跑起来,看到的正确结果比背十遍答案都有用。

等你把这些题都过了一遍,下一步我建议你去接触一门具体的数据库产品。理论教材讲的是通用原理,但真实工作中你大概率会用 MySQL、PostgreSQL 这类开源数据库。你可以学着建库、建表、插入数据,然后把教材里的 SQL 语句换成这些环境里的写法。你会发现很多语法细节不一样,但核心概念完全一致。

我从很早起就在做一件事:每学完一章,不继续往前翻,而是用自己的话把这一章的关键概念写在纸上,写不出来的地方就回文档里再查一遍。从那以后,我每次复习数据库都强制走一遍“合上答案—自己写—对照查漏”的流程。这个方法帮我熬过了考试和面试,希望也帮到你。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/22 6:43:08

SAP Data Services连接MySQL:ODBC驱动与元数据导入避坑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/22 6:41:02

基于PJ85718DM与STM32L081CB的低功耗HVAC温控系统设计

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/22 6:40:29

STM32F334+PJ85718DM:HVAC多点远程温度采集实战复盘

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/22 6:40:29

基于PJ85718DM与PIC32的嵌入式双路温度监测与HVAC联动方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/22 6:39:41

STM32F303VC结合PJ85718DM实现HVAC双通道温度采集系统

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/22 6:37:35

嵌入式测温系统实战:本地PJ85718DM与远程R7KA8M2JFLCAC双通道方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华