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 ‘西安%’
必须以"西安"开头