问答题
[问题4]
用SQL语句完成下述要求。
(1) 定义一个描述订单的客户号和对应订单明细中产品号关系的视图:客户产品(客户号,产品号)。
(2)借助(1)所定义的视图,查询至少购买了01号客户购买的所有产品的客户号。
SELECT客户号
FROM客户产品 客户产品1
WHERE {{U}} (j) {{/U}}
(SELECT*
FROM客户产品 客户产品2
WHERRE {{U}} (k) {{/U}}
(SELECT*
FROM客户产品 客户产品3
WHERRE {{U}} (1) {{/U}} ));
【正确答案】
【答案解析】CREATE VIEW客户产品AS(
SELECT 客户号,产品号
FROM 订单,订单明细
WHERE 订单明细.订单号=订单.订单号);
(2)
(j)NOT EXISTS
(k)客户号='01' AND NOT EXISTS
(1)客户产品1.客户号=客户产品3.客户号AND客户产品2.产品号
=客户产品3.产品号
[分析]
本题考核的知识点是SQL中的视图创建和SQL查询命令。
SQL语言用CREATE VIEW命令建立视图,其格式为:
CREATE VIEW <视图名>[(<列名>[,<列名>]...)]
AS <子查询>
[WITHCHECKOPTION];
根据题目描述,一个订单涉及多个产品,订单中的每个产品对应一项订单明细。一个订单对应一个客户,一个客户可以有多个订单。要建立客户号和产品号的关系,必须通过订单和订单明细。一个客户号对应多个订单,一个订单对应多项订单明细,一项订单明细对应一个产品。所以,视图如下:
CREATE VIEW客户产品AS(
SELECT 客户号,产品号
FROM 订单,订单明细
WHERE 订单明细.订单号=订单.订单号);
要查找至少购买了01号客户购买的所有产品的客户号,可借助上述的客户产品视图。通过该视图,可以知道每个客户购买过的产品号。根据01号客户购买的所有产品号,看看是否存在这样的客户号,其对应的产品号集合包含这些产品号(01号客户购买的所有产品号)。查找可以进一步转换成,查询客户X,使得不存在这样的产品Y,01号客户购买了Y,而客户X没有购买。