楼主: Leslie荣
119 0

[图行天下] 数据库系统概论(第6版 王珊 杜小勇 陈红)第三章课后习题答案 [推广有奖]

  • 0关注
  • 0粉丝

等待验证会员

学前班

40%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
0.0077
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
20 点
帖子
1
精华
0
在线时间
0 小时
注册时间
2018-5-23
最后登录
2018-5-23

楼主
Leslie荣 发表于 2025-11-26 12:10:51 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

《数据库系统概论(第6版)》第三章课后习题与补充题解析

本文整理了“关系数据库标准语言SQL”一章的课后练习及附加题目解答,采用一问一答形式呈现,便于学习者对照理解与复习巩固。

1. 简要说明SQL的主要特点

① 集成多种功能,风格统一。SQL融合了数据定义(DDL)、数据操作(DML)和数据控制(DCL)三大功能模块,形成一体化的语言体系。

② 操作方式高度非过程化。用户在使用SQL时只需指明“需要完成什么”,无需关心“如何实现”,具体的执行路径和操作流程由数据库系统自动规划与处理。

③ 支持集合式操作。SQL以集合为基本操作单位,无论是查询结果还是插入、删除、更新等操作对象,均可作用于一组元组,提升处理效率。

④ 统一语法支持多种使用场景。SQL既可作为独立语言通过交互方式直接运行,也可嵌入C、C++、Java、Python等高级编程语言中,灵活适用于不同开发环境。

⑤ 语言结构简洁,易于掌握与应用。

2. DROP TABLE语句中RESTRICT与CASCADE有何区别?

使用RESTRICT选项时,删除表的操作受到严格限制:若该表被其他数据库对象依赖,如被视图引用、存在外键约束、触发器、存储过程或函数调用等情况,则无法执行删除操作。

而选用CASCADE时,系统将允许无条件删除指定的基本表,并同时级联删除所有与其相关的依赖对象(例如基于该表创建的视图等)。

3. 给定两个关系S(A, B, C, D)与T(C, D, E, F),请写出下列关系代数表达式对应的SQL语句

① σA=10(S)

SELECT * FROM S WHERE A = 10

② πA,B(S)

SELECT DISTINCT A, B FROM S

③ S T

SELECT A, B, S.C, S.D, E, F FROM S, T WHERE S.C = T.C AND S.D = T.D

【解析】此为自然连接操作,系统会自动匹配两表中同名属性(C和D)并进行连接。

④ S S.C=T.C T

SELECT A, B, S.C, S.D, T.C, T.D, E, F FROM S, T WHERE S.C = T.C

【解析】属于等值连接,仅依据S表与T表中C字段相等的条件进行连接。

⑤ S A<E T

SELECT A, B, S.C, S.D, T.C, T.D, E, F FROM S, T WHERE A < E

⑥ πC,D(S) × T

SELECT S1.C, S1.D, T.C, T.D, E, F FROM (SELECT DISTINCT C, D FROM S) AS S1,T

4. 使用SQL语句构建SPJ数据库中的四个表S、P、J、SPJ,并完成指定查询任务

创建S表(供应商信息):

CREATE TABLE S
(SNO CHAR(3) PRIMARY KEY,
SNAME CHAR(10),
STATUS CHAR(2),
CITY CHAR(10));

创建P表(零件信息):

CREATE TABLE P
(PNO CHAR(3) PRIMARY KEY,
PNAME CHAR(10),
COLOR CHAR(4),
WEIGHT INT);

创建J表(工程项目信息):

CREATE TABLE J
(JNO CHAR(3) PRIMARY KEY,
JNAME CHAR(10),
CITY CHAR(10));

创建SPJ表(供应情况记录):

CREATE TABLE SPJ
(SNO CHAR(3),
PNO CHAR(3),
JNO CHAR(3),
QTY INT,
PRIMARY KEY (SNO,PNO,JNO),
FOREIGN KEY (SNO) REFERENCES S(SNO),
FOREIGN KEY (PNO) REFERENCES P(PNO),
FOREIGN KEY (JNO) REFERENCES J(JNO));

注:建表完成后需根据实际需求插入相应数据,此处省略具体插入步骤。

基于上述表结构执行以下查询

查询1:找出为工程J1提供零件的所有供应商编号SNO

SELECT SNO
FROM SPJ
WHERE JNO='J1';

查询2:查找为工程J1供应零件P1的供应商编号SNO

SELECT SNO
FROM SPJ
WHERE JNO='J1' AND PNO='P1';

查询3:检索为工程J1供应红色零件的供应商编号SNO

SELECT SNO
FROM SPJ
WHERE JNO='J1' AND PNO IN
(SELECT PNO
FROM P
WHERE COLOR='红');

或使用连接方式实现:

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

查询4:获取未使用天津地区供应商所提供红色零件的工程编号JNO

SELECT JNO FROM J
WHERE NOT EXISTS
(SELECT *
FROM SPJ
WHERE SPJ.JNO=J.JNO AND SNO IN
(SELECT SNO
FROM S
WHERE CITY='天津')
AND PNO IN
(SELECT PNO
FROM P
WHERE COLOR='红'));

5. 针对S、P、J及SPJ四张表,使用SQL语句实现以下操作

1. 查询所有供应商的名称及其所在城市信息。

SELECT SNAME, CITY
FROM S;

2. 获取全部零件的名称、颜色以及重量数据。

SELECT PNAME, COLOR, WEIGHT
FROM P;

3. 查找使用了供应商S1所提供零件的工程项目编号(JNO)。

SELECT JNO
FROM SPJ
WHERE SNO = 'S1';

4. 检索工程项目J2所使用的各类零件的名称与对应数量。

SELECT P.PNAME, SPJ.QTY
FROM P, SPJ
WHERE P.PNO = SPJ.PNO AND SPJ.JNO = 'J2';

5. 找出由上海地区的厂商供应的所有不同零件代码(PNO)。

SELECT DISTINCT PNO
FROM SPJ
WHERE SNO IN (
    SELECT SNO
    FROM S
    WHERE CITY = '上海'
);

6. 查询使用了产自上海的零件的工程项目的名称(JNAME)。

SELECT JNAME
FROM J, SPJ, S
WHERE J.JNO = SPJ.JNO AND SPJ.SNO = S.SNO AND S.CITY = '上海';

或采用子查询方式:

SELECT JNAME
FROM J
WHERE JNO IN (
    SELECT JNO
    FROM SPJ, S
    WHERE SPJ.SNO = S.SNO AND S.CITY = '上海'
);

7. 找出未使用任何天津产地零件的工程项目代码(JNO)。

SELECT JNO
FROM J
WHERE NOT EXISTS (
    SELECT *
    FROM SPJ
    WHERE SPJ.JNO = J.JNO AND SPJ.SNO IN (
        SELECT SNO
        FROM S
        WHERE CITY = '天津'
    )
);

另一种等价写法如下:

SELECT JNO
FROM J
WHERE NOT EXISTS (
    SELECT *
    FROM SPJ, S
    WHERE SPJ.JNO = J.JNO AND SPJ.SNO = S.SNO AND S.CITY = '天津'
);

8. 将所有红色零件的颜色更改为蓝色。

UPDATE P
SET COLOR = '蓝'
WHERE COLOR = '红';

9. 将原由S5向J4供应的零件P6,改为由S3进行供应。

UPDATE SPJ
SET SNO = 'S3'
WHERE SNO = 'S5' AND JNO = 'J4' AND PNO = 'P6';

10. 删除供应商S2的相关记录,并同时清除其在供应情况表中的所有关联条目。

DELETE FROM SPJ
WHERE SNO = 'S2';

DELETE FROM S
WHERE SNO = 'S2';

11. 向供应情况表中插入一条新的供应记录:(S2, J6, P4, 200)。

INSERT INTO SPJ(SNO, JNO, PNO, QTY)
VALUES ('S2', 'J6', 'P4', 200);

或者使用无列名格式:

INSERT INTO SPJ VALUES ('S2', 'P4', 'J6', 200);

关于基本表与视图的概念解析

什么是基本表?什么是视图?两者之间的区别和联系有哪些?

基本表是数据库中实际独立存在的数据结构,每一个关系模型中的实体通常对应一个基本表。它直接存储数据记录,是数据物理组织的基础。

视图则是基于一个或多个基本表通过查询语句导出的虚拟表。数据库系统并不保存视图的实际数据,仅保留其定义逻辑。当用户访问视图时,系统会动态执行对应的查询来获取结果。因此,视图是一种虚表,但其使用方式与基本表一致,支持进一步查询甚至在其上构建新视图。

视图的主要优势分析

  • 提供安全机制,隐藏敏感字段,限制用户只能访问特定数据集,从而保护机密信息。
  • 增强数据库的逻辑独立性,在底层表结构发生变化时,可通过调整视图定义保持应用程序接口稳定。
  • 简化复杂查询操作,使用户无需了解多表连接细节即可获取所需信息。
  • 允许从多个视角观察同一组数据,提升数据分析灵活性。

可更新视图与不可更新视图的分类说明

一般而言,若视图为基本表的行列子集(即仅选择部分行和列,且不包含聚合函数、表达式或分组),则该类视图通常是可更新的。例如:

-- 示例:可更新视图(如创建S表的部分数据视图)
CREATE VIEW SHANGHAI_SUPPLIERS AS
SELECT SNO, SNAME, CITY
FROM S
WHERE CITY = '上海';

对此视图执行INSERT、UPDATE或DELETE操作可以映射回原基本表S。

而如果视图的字段来源于聚集函数、算术表达式或涉及多表连接并含去重操作,则此类视图通常不可更新。例如:

-- 示例:不可更新视图
CREATE VIEW PART_COUNT_BY_COLOR AS
SELECT COLOR, COUNT(*) AS TOTAL
FROM P
GROUP BY COLOR;

由于TOTAL为统计值,并非真实存储的数据,无法确定如何反向修改原始记录,故不允许更新操作。

为“三建”工程项目建立供应情况视图并执行相关查询

首先,创建一个名为V_SPJ_SANJIAN的视图,用于展示“三建”工程的供应详情,包括供应商代码(SNO)、零件代码(PNO)和供应数量(QTY)。

CREATE VIEW V_SPJ_SANJIAN(SNO, PNO, QTY) AS
SELECT SPJ.SNO, SPJ.PNO, SPJ.QTY
FROM SPJ, J
WHERE SPJ.JNO = J.JNO AND J.JNAME = '三建';
SELECT * FROM S WHERE A = 10

基于上述视图,可开展各类查询操作,如查看某个零件的供应来源、统计总供货量等,具体根据业务需求灵活应用。

求至少使用了与供应商S1所供全部零件相同的工程项目的代码(JNO)

此问题属于集合包含类查询,需找出那些使用的零件集合完全覆盖S1所提供零件集合的工程项目。

SELECT DISTINCT JNO
FROM SPJ SPJZ
WHERE NOT EXISTS (
    SELECT *
    FROM SPJ SPJX
    WHERE SNO = 'S1'
    AND NOT EXISTS (
        SELECT *
        FROM SPJ SPJY
        WHERE SPJY.PNO = SPJX.PNO
        AND SPJY.JNO = SPJZ.JNO
    )
);

该查询利用双重否定逻辑,确保目标项目JNO使用了S1提供的每一种零件。

补充:查找未使用天津产零件的工程项目的其他表达形式

除了前面列出的EXISTS方式外,也可借助集合差的思想实现:

SELECT JNO
FROM J
WHERE JNO NOT IN (
    SELECT JNO
    FROM SPJ, S
    WHERE SPJ.SNO = S.SNO AND S.CITY = '天津'
);

注意此方法在存在NULL值时可能产生意外行为,推荐优先使用NOT EXISTS方式以保证准确性。

1. 查询三建工程项目所使用的零件代码及数量

首先创建一个视图,用于提取与“三建”工程相关的供应信息:

CREATE VIEW V_SPJ AS
SELECT SNO, PNO, QTY
FROM SPJ
WHERE JNO = (
    SELECT JNO
    FROM J
    WHERE JNAME = '三建'
);

基于该视图进行查询:

  • 获取所有用于三建工程的零件编号及其数量:
SELECT PNO, QTY FROM V_SPJ;
  • 查询供应商S1向三建工程提供的零件情况:
SELECT PNO, QTY
FROM V_SPJ
WHERE SNO = 'S1';

2. 空值的概念、表示方式及其运算规则

空值(NULL)是指在实际应用中尚未确定、未知或无意义的数据状态。例如,在将学生信息录入Student表时,若某些学生的部分信息未填写,则这些字段可设置为空值。

在SQL中,使用NULL来表示空值。当定义表结构时,如果某列设置了NOT NULL约束,则该列不允许插入空值。

关于空值参与运算的规则如下:

  • 任何算术运算中,只要涉及空值,结果也为NULL
  • 在比较操作中,空值与任意值(包括另一个空值)进行比较的结果为UNKNOWN

补充习题解析

一、选择题

  1. 关于SQL的说法,正确的是( )。

    A. 数据控制功能不是SQL的功能之一
    B. SQL采用的是面向记录的操作方式,以记录为单位进行操作
    C. SQL是非过程化的语言,用户无须指定存取路径
    D. SQL作为嵌入式语言,其语法与独立的语言有较大差别

    答案:C

  2. 对表中数据执行删除操作应使用( )。

    A. DELETE
    B. DROP
    C. ALTER
    D. UPDATE

    答案:A

  3. 数据库中建立索引的主要目的是( )。

    A. 加快建表速度
    B. 加快存取速度
    C. 提高安全性
    D. 节省存储空间

    答案:B

  4. 视图属于数据库系统三级模式中的( )。

    A. 外模式
    B. 模式
    C. 内模式
    D. 模式映像

    答案:A

  5. 下列说法不正确的是( )。

    A. 基本表和视图一样,都是关系
    B. 可以使用SQL对基本表和视图进行操作
    C. 可以从基本表或视图上定义新的视图
    D. 基本表和视图中都存储数据

    答案:D

二、判断题

  1. 视图不仅可以从单个基本表导出,还可以从多个基本表导出。
    答案:√
  2. 不是所有的视图都可以进行更新,但视图都可以进行插入。
    答案:×
  3. SELECT子句中的目标列可以是表中的属性列,也可以是表达式。
    答案:√
  4. SQL语句中判断某个属性X为空,可以写成 WHERE X = NULL。
    答案:×
  5. SQL中逻辑运算符AND和OR的优先级相同。
    答案:×
  6. 谓词ANY或ALL必须与比较运算符一起使用。
    答案:√

三、填空题

1 SQL语言具有______、______、______和数据控制的功能。
2 SQL语句中用来消除重复的关键词是______。
3 若一个视图是从单个基本表导出的,并且只是去掉了基本表的某些行和某些
列,但保留了主码,这类视图称为______。
4 SQL语言的数据定义功能包括______、表定义、视图定义和______等。

四、问答题

  1. 解释相关子查询与不相关子查询的区别。

    在嵌套查询中,若子查询的条件不依赖于外层父查询,则称为不相关子查询;反之,若子查询的查询条件依赖于父查询的当前行数据,则称为相关子查询。

  2. 写出谓词ANY和ALL与聚集函数或IN之间的等价转换关系。

    比较运算符 ANY ALL
    = IN -
    <> - NOT IN
    < < MAX < MIN
    <= <= MAX <= MIN
    > > MIN > MAX
    >= >= MIN >= MAX

五、综合题

已知关系 R 包含属性 A、B、C,数据如下:

A B C
10 NULL 20
20 30 NULL

针对不同条件 X,执行查询语句 SELECT * FROM R WHERE X; 的结果如下:

  1. X = A IS NULL → 结果集为空
  2. X = A > 8 AND B < 20 → 结果集为空(因B为NULL,比较结果为UNKNOWN)
  3. X = A > 10 OR B < 20 → 返回一行:
    ABC
    2030NULL
  4. X = C + 10 > 25 → 返回一行:
    ABC
    10NULL20
  5. X = EXISTS (SELECT B FROM R WHERE A = 10) → 条件成立,返回全部两行:
    ABC
    10NULL20
    2030NULL
  6. X = C IN (SELECT B FROM R) → 结果集为空(C值为20或NULL,而B中没有匹配项)
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:课后习题答案 数据库系统 习题答案 课后习题 数据库

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
jg-xs1
拉您进交流群
GMT+8, 2025-12-5 18:25