[问题4] 用SQL语句完成下述要求。 (1) 定义一个描述订单的客户号和对应订单明细中产品号关系的视图:客户产品(客户号,产品号)。 (2)借助(1)所定义的视图,查询至少购买了01号客户购买的所有产品的客户号。 SELECT客户号 FROM客户产品 客户产品1 WHERE (j) (SELECT* FROM客户产品 客户产品2 WHERRE (k) (SELECT* FROM客户产品 客户产品3 WHERRE (1) ));
参考答案:
解析: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没有购买。