FChao
发布于 2026-05-05 / 2 阅读
0
0

数据库系统工程师⑬:SQL语言

1.某超市的商品(商品号,商品名称,生产商,单价)和仓库(仓库号,地址,电话,商品号,库存量)两个基本关系如表1和表2所示。

a.仓库关系的主键是( 仓库号,商品号 ),该关系没有达到第三范式的原因是( 2 );

b.查询联想生产的激光打印机的总库存量的SQL语句如下:

SELECT 商品名称,( 3 )

FROM 商品,仓库

WHERE( 4 )AND( 5 ) ;

c.若仓库关系的地址不能为空,请将下述仓库关系SQL语句的空缺部分补充完整。CREATE TABLE 仓库(仓库号CHAR(2),

地址 CHAR(20)( 6 ) ,

电话 CHAR(20),

商品号 CHAR(5),

库存量NUMERIC(5),

( 7 ) ,

( 8 ) );

请作答:第 2 题

A没有消除非主属性对码的部分函数依赖,如:仓库号→电话

B没有消除非主属性对码的部分函数依赖,如:地址→电话

不存在地址→电话这个依赖

C只消除了非主属性对码的部分函数依赖,而未消除传递函数依赖

部分依赖没消除,根本就不满足2NF,更别说3NF了,不要因为题目问的是3NF就去选3NF的条件

D只消除了非主属性对码的传递函数依赖,而未消除部分函数依赖

分析范式,先看关系中的属性,还有哪些是候选键/主属性/非主属性,试着列出每一条依赖

仓库关系:仓库(仓库号,地址,电话,商品号,库存量)

主键:(仓库号,商品号)

  • 仓库号 → 地址:地址只由仓库号决定,与商品号无关

  • 仓库号 → 电话:电话只由仓库号决定,与商品号无关

  • (仓库号,商品号)→ 库存量:库存量由完整的键决定

地址只依赖于仓库号(主键的一部分),这是部分函数依赖

电话也只依赖于仓库号(主键的一部分),也是部分函数依赖

所以仓库关系 不满足 2NF。

请作答:第 3 题

A NUMBER(库存量)NUMBER 是数据类型,不是函数。

B SUM(库存量)

C COUNT(库存量)统计行数!不是求总和

D TOTAL(库存量)SQL数据库中不存在total这个用法

请作答:第 4 题

A生产商=联想

字符串不加引号会被认为是列名

B仓库.生产商=联想

C生产商=‘联想’

只有一张表有生产商,所以前缀是可以省略的

D仓库.生产商=‘联想’

仓库这个表里跟没有生产商这个字段

第5题:

商品名称=‘激光打印机’ AND 商品.商品号=仓库.商品号

请作答:第 6 题

A NOT NULL

仔细阅读题目:仓库地址不能为空

第7题:

PRIMARY KEY(仓库号,商品号)

一开始就分析了仓库号和商品号是主键

外键:FOREIGN KEY/REFERENCES

请作答:第 8 题

A FOREIGN KEY(仓库号)REFERENCES 仓库号

语法错误,在任何情况下都不能简写

B FOREIGN KEY(仓库号)REFERENCES 仓库(仓库号)

  • 自己引用自己,没有意义

C FOREIGN KEY(商品号)REFERENCES 仓库(商品号)

  • 自己引用自己,没有意义

D FOREIGN KEY(商品号)REFERENCES 商品(商品号)

外键约束的标准格式:

FOREIGN KEY (本表列名) REFERENCES 外表名(外表列名)

撤回:REVOKE/RESTRICT/CASCADE

9.撤销 U5 对 Emp 表的查询权限,并收回 U5 授予其它用户的该权限,SQL 语句是 ()。

A REVOKE SELECT ON TABLE Emp FROM U5 CASCADE;

标准SQL中收回权限的基本语法是:

REVOKE<权限>FROM<对象数据><对象名>FROM<用户>[RESTRICT|CASCADE];

CASCADE表示级联收回,即收回用户权限并同时收回该用户授予其他用户的该权限。

B REVOKE SELECT ON TABLE Emp FROM U5 RESTRICT;

RESTRICT 表示如果 U5 已经把权限转授出去,就拒绝执行这条回收语句,相当于没执行命令

C REVOKE QUERY ON TABLE Emp FROM U5 CASCADE;

QUERY指的是向数据库发出的任何请求,不是命令

D GRANT SELECT ON TABLE Emp TO U5 WITH GRANT OPTION;

GRANT 是授予权限,不是收回权限,而且 WITH GRANT OPTION 表示允许 U5 再转授给别人,和回收权限的要求反了。

创建表主码和外码的要求

10.11.设有职工关系Emp(Eno,Ename,Esex,EDno)和部门关系Dept(Dno,Dname,Daddr),创建这两个关系的SQL语句如下:

CREATE TABLE Emp(

Eno CHAR(4),

Ename CHAR(8),

Esex CHAR(1) CHECK(Esex IN (‘M’, ‘F’)),

EDno CHAR(4) REFERENCES Dept(Dno),

PRIMARY KEY (Eno)

);

CREATE TABLE Dept(

Dno CHAR(4) NOT NULL UNIQUE,

Dname CHAR(20),

Daddr CHAR(30)

);

直接运行该语句,DBMS会报错,原因是:( 10 )。若经过修改,上述两个表创建完毕之后(尚无数据),则下述语句中能被执行的是( 11 )。

请作答:第 10 题

A创建表Dept时没有指定主码

ept 表用了 NOT NULL UNIQUE,虽然不是用 PRIMARY KEY 显式声明,但在大多数 DBMS 中可以当作候选码使用,不是导致报错的直接原因。

B创建表Dept时没有指定外码

C创建表Emp时,被参照表Dept尚未创建

Emp 建表时发现参照了一个不存在的表,会直接报错。

D表Emp的外码EDno与被参照表Dept的主码Dno不同名

没有这个要求,只要类型匹配就行。

请作答:第 11 题

A INSERT INTO Emp VALUES(‘e001’, ‘王’, ‘M’, ‘d1’);

外键 'd1' 在空的 Dept 表中不存在,违反外键约束

B INSERT INTO Emp VALUES(NULL, ‘王’, ‘M’, ‘d1’);

违反主键约束(实体完整性)

C INSERT INTO Emp VALUES(‘e001’, ‘王’, ‘M’, NULL);

D INSERT INTO Emp VALUES(‘e001’, ‘王’, ‘X’, ‘d1’);

违反 CHECK 约束,只能是M或者F

Emp 表约束:

  • Eno CHAR(4) → 必须提供值(字符型)。

  • PRIMARY KEY (Eno) → 不能为空,不能重复。

  • Esex CHAR(1) CHECK(Esex IN (‘M’, ‘F’)) → 只能是 M 或 F,注意字符串格式。

  • EDno CHAR(4) REFERENCES Dept(Dno) → 外键约束。当前 Dept 表是空的没有数据,所以插入非空 EDno 会违反外键约束,只能插入 NULL(假设允许为空)。

SQLCA/游标/指示变量/动态SQL

12.嵌入式 SQL 中,将记录的属性值赋给主变量时,若属性为空值,而主变量不能空值,为解决这一矛盾,使用的机制是()。

A SQLCA

通信区,记录 SQL 语句执行的整体状态信息(如错误码、警告)

B 游标

用于处理多行查询结果

C 指示变量

D 动态SQL 运行时动态构造 SQL 语句,用于处理不确定的查询结构

聚簇索引

13.要实现记录的物理顺序与索引项次序一致,应选择的索引类型是()。

  • A. HASH 索引:基于哈希函数将键值映射到桶中,数据的物理存储与键值顺序没有关系,查找时通过哈希值快速定位,不涉及排序。 ❌

  • B. 聚簇索引索引的逻辑顺序与数据的物理顺序一致 ✅

    • 把逻辑上相关的数据,物理上“聚”到一起

    • 就像《新华字典》的正文,所有汉字(数据行)本身就是按照拼音字母(索引键)的顺序,从 A 到 Z 实实在在排版装订的。

  • C. B+树索引

    • 非聚簇的 B+树索引,叶子节点存储的是指向数据行的指针(或主键),数据的物理顺序可以与索引顺序不同

    • 只有在建立聚簇索引时如果使用 B+树结构,才具有聚簇特性

    • 题干强调的是“物理顺序一致”这个特性,而非树结构本身。 ❌

  • D. 单一索引:指索引键只有一个属性列,与数据的物理存储顺序无关。 ❌

14.15.某销售公司数据库的零件P(零件号,零件名称,供应商,供应商所在地,单价,库存量)关系如表1所示,

其中同一种零件可由不同的供应商供应,一个供应商可以供应多种零件。

零件关系的主键为 ( 零件号/供应商 ) ,该关系存在冗余以及插入异常和删除异常等问题。为了解决这一问题需要将零件关系分解为 ( 15 ) 。

对零件关系P,查询各种零件的平均单价、最高单价与最低单价之间差价的SQL语句为:  

SELECT   零件号,   ( 16 ) 

FROM    P 

 ( 17 )  ;

对零件关系 P,查询库存量大于等于 100 小于等于 500 的零件“P1”的供应商及库存量,要求供应商地址包含“西安” 。实现该查询的SQL语句为:

SELECT 零件名称,供应商名,库存量

FROM    P

WHERE ( 18 )  AND ( 19 )    ;

请作答:第 15 题

原始关系:P(零件号,零件名称,供应商,供应商所在地,单价,库存量)

主键:(零件号,供应商)

  • 零件号 → 零件名称

  • 供应商 → 供应商所在地

  • (零件号,供应商)→ 单价

  • (零件号,供应商)→ 库存量

A P1(零件号,零件名称,单价) 、P2(供应商,供应商所在地,库存量)

单价不依赖于零件号

B P1(零件号,零件名称) 、P2(供应商,供应商所在地,单价,库存量)

零件号和供应商才是主键,P2缺失了

C P1(零件号,零件名称) 、P2(零件号,供应商,单价,库存量)、P3(供应商,供应商所在地)

D P1(零件号,零件名称)、P2(零件号,单价,库存量)、P3(供应商,供应商所在地)、P4(供应商所在地,库存量)

应该保留完全依赖于主键(零件号,供应商)的属性:(零件号,供应商,单价,库存量),况且供应商所在地和库存量没有关系

非聚合字段

SELECT   零件号,   ( 16 ) 

FROM    P 

 ( 17 )  ;

请作答:第 16 题

A零件名称,AVG(单价),MAX(单价)− MIN(单价)

B供应商,AVG(单价),MAX(单价)− MIN(单价)

C零件名称,AVG 单价,MAX 单价− MIN 单价

D供应商,AVG 单价,MAX 单价 − MIN 单价

请作答:第 17 题

A ORDER BY 供应商

B ORDER BY 零件号

C GROUP BY 供应商

D GROUP BY 零件号

16/17题联系起来看:

聚合列​​:使用了聚合函数的列,如 SUM(sales), COUNT(*), AVG(score)

​​非聚合列​​:直接列出的原始列,如 product_name, department

只要 SELECT 里出现了 AVG(单价) 这样的聚合函数:

SQL 就要求必须对所有非聚合字段(普通列)进行分组,所以必须有Group By

GROUP BY 零件号 之后,组内情况:
┌──────────┬──────────┬──────────┐
│ 零件号   │ 零件名称 │ 单价     │
├──────────┼──────────┼──────────┤
│ 010023   │ P2      │ 22.80   │
│ 010023   │ P2      │ 28.00   │  ← 名称都叫 P2,固定不变
├──────────┼──────────┼──────────┤
│ 010024   │ P3      │ 280.00  │
│ 010024   │ P3      │ 260.00  │  ← 名称都叫 P3,固定不变
└──────────┴──────────┴──────────┘

为什么是group by零件号?因为零件号相同的零件型号相同,不管来自哪个供应商,我们先选出对应型号的零件再去比价才是符合需求的。

其次,零件号 → 零件名称

如果我们select 供应商,再group by 供应商,那零件号这个非聚合列就没有被分组,这是不允许的。而零件名称和零件号有依赖关系,可以select 零件名称再group by零件号。

SELECT 零件名称,供应商名,库存量

FROM    P

WHERE ( 18 )  AND ( 19 )    ;

请作答:第 18 题

A零件名称= ‘P1’ AND库存量Between 100 AND 500

B零件名称= ‘P1’ AND库存量Between 100 TO 500

没有 TO 这种用法

请作答:第 19 题

A供应商所在地in ‘%西安%’

IN 是精确匹配列表

B供应商所在地like ‘__西安%’

意思是西安的前面恰好只有两个任意字符

C供应商所在地like ‘%西安%’

D供应商所在地like ‘西安%’

必须以"西安"开头


评论