本文整理了“关系数据库标准语言SQL”一章的课后练习及附加题目解答,采用一问一答形式呈现,便于学习者对照理解与复习巩固。
① 集成多种功能,风格统一。SQL融合了数据定义(DDL)、数据操作(DML)和数据控制(DCL)三大功能模块,形成一体化的语言体系。
② 操作方式高度非过程化。用户在使用SQL时只需指明“需要完成什么”,无需关心“如何实现”,具体的执行路径和操作流程由数据库系统自动规划与处理。
③ 支持集合式操作。SQL以集合为基本操作单位,无论是查询结果还是插入、删除、更新等操作对象,均可作用于一组元组,提升处理效率。
④ 统一语法支持多种使用场景。SQL既可作为独立语言通过交互方式直接运行,也可嵌入C、C++、Java、Python等高级编程语言中,灵活适用于不同开发环境。
⑤ 语言结构简洁,易于掌握与应用。
使用RESTRICT选项时,删除表的操作受到严格限制:若该表被其他数据库对象依赖,如被视图引用、存在外键约束、触发器、存储过程或函数调用等情况,则无法执行删除操作。
而选用CASCADE时,系统将允许无条件删除指定的基本表,并同时级联删除所有与其相关的依赖对象(例如基于该表创建的视图等)。
① σ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④ 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 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
创建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='红'));
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所提供零件集合的工程项目。
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;
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
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; 的结果如下:
A IS NULL → 结果集为空A > 8 AND B < 20 → 结果集为空(因B为NULL,比较结果为UNKNOWN)A > 10 OR B < 20 → 返回一行:| A | B | C |
|---|---|---|
| 20 | 30 | NULL |
C + 10 > 25 → 返回一行:| A | B | C |
|---|---|---|
| 10 | NULL | 20 |
EXISTS (SELECT B FROM R WHERE A = 10) → 条件成立,返回全部两行:| A | B | C |
|---|---|---|
| 10 | NULL | 20 |
| 20 | 30 | NULL |
C IN (SELECT B FROM R) → 结果集为空(C值为20或NULL,而B中没有匹配项)
扫码加好友,拉您进群



收藏
