《数据库系统概论(第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。
补充习题解析
一、选择题
-
关于SQL的说法,正确的是( )。
A. 数据控制功能不是SQL的功能之一
B. SQL采用的是面向记录的操作方式,以记录为单位进行操作
C. SQL是非过程化的语言,用户无须指定存取路径
D. SQL作为嵌入式语言,其语法与独立的语言有较大差别答案:C
-
对表中数据执行删除操作应使用( )。
A. DELETE
B. DROP
C. ALTER
D. UPDATE答案:A
-
数据库中建立索引的主要目的是( )。
A. 加快建表速度
B. 加快存取速度
C. 提高安全性
D. 节省存储空间答案:B
-
视图属于数据库系统三级模式中的( )。
A. 外模式
B. 模式
C. 内模式
D. 模式映像答案:A
-
下列说法不正确的是( )。
A. 基本表和视图一样,都是关系
B. 可以使用SQL对基本表和视图进行操作
C. 可以从基本表或视图上定义新的视图
D. 基本表和视图中都存储数据答案:D
二、判断题
- 视图不仅可以从单个基本表导出,还可以从多个基本表导出。
答案:√ - 不是所有的视图都可以进行更新,但视图都可以进行插入。
答案:× - SELECT子句中的目标列可以是表中的属性列,也可以是表达式。
答案:√ - SQL语句中判断某个属性X为空,可以写成 WHERE X = NULL。
答案:× - SQL中逻辑运算符AND和OR的优先级相同。
答案:× - 谓词ANY或ALL必须与比较运算符一起使用。
答案:√
三、填空题
1 SQL语言具有______、______、______和数据控制的功能。
2 SQL语句中用来消除重复的关键词是______。
3 若一个视图是从单个基本表导出的,并且只是去掉了基本表的某些行和某些
列,但保留了主码,这类视图称为______。
4 SQL语言的数据定义功能包括______、表定义、视图定义和______等。
四、问答题
-
解释相关子查询与不相关子查询的区别。
在嵌套查询中,若子查询的条件不依赖于外层父查询,则称为不相关子查询;反之,若子查询的查询条件依赖于父查询的当前行数据,则称为相关子查询。
-
写出谓词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; 的结果如下:
- X =
A IS NULL→ 结果集为空 - X =
A > 8 AND B < 20→ 结果集为空(因B为NULL,比较结果为UNKNOWN) - X =
A > 10 OR B < 20→ 返回一行:
A B C 20 30 NULL - X =
C + 10 > 25→ 返回一行:
A B C 10 NULL 20 - X =
EXISTS (SELECT B FROM R WHERE A = 10)→ 条件成立,返回全部两行:
A B C 10 NULL 20 20 30 NULL - X =
C IN (SELECT B FROM R)→ 结果集为空(C值为20或NULL,而B中没有匹配项)



雷达卡


京公网安备 11010802022788号







