问答题 .阅读下列说明,回答问题1至问题5。
    [说明]
    某公司要对其投放的自动售货机建立商品管理系统,其数据库的部分关系模式如下:
    售货机:VEM(VEMno, Location),各属性分别表示售货机编号、部署地点;
    商品:GOODS(Gno, Brand,Price),各属性分别表示商品编号、品牌名和价格;
    销售单:SALES(Sno, VEMno, Gno, sDate, sTime),各属性分别表示销售号、售货机编号、
    商品编号、日期和时间。  ………
    缺货单:OOS(VEMno, Gno, sDate, sTime),各属性分别表示售货机编号、商品编号、日期和
    时间。
    相关关系模式的属性及说明如下:
    (1)售货机摆放固定种类的商品,售货机内每种商品最多可以储存10件。管理员在每天结束的时候将售货机中所有售出商品补全。
    (2)每售出一件商品,就自动向销售单中添加一条销售记录。如果一天内某个售货机上某种商品的销售记录达到10条,则表明该售货机上该商品已售完,需要通知系统立即补货,通过自动向缺货单中添加一条缺货记录来实现。
    根据以上描述,回答下列问题,将SQL语句的空缺部分补充完整。
问答题 1.  [问题1]
    请将下面创建销售单表的SQL语句补充完整,要求指定关系的主码和外码约束。
    CREATE TABLE SALES  (
    Sno CHAR(8)______,
    VEMno CHAR(5)______,
    Gno CHAR(8)______,
    SDate DATE,
    STime TIME)  ;
【正确答案】PRIMARY KEY
REFERENCES VEM(VEMno)
REFERENCES GOODS(Gno)
【答案解析】
问答题 2.  [问题2]
    创建销售记录详单视图SALES_Detail,要求按日期统计每个售货机上各种商品的销售数量,属性有VEMno、Location、Gno、Brand、Price、amount和SDate。为方便实现,首先建立一个视图SALES_Total,然后利用SALES_Total完成视图SALES Detail的定义。
    CREATE VIEW SALES_Total(VEMno, Gno, SDate, amount)  AS
    SELECT VEMno,  Gno,  SDate, Count(*)
    FROM SALES
    GROUP BY ______;
    CREATE VIEW ______ AS
    SELECT  VEM.VEMno, Location, GOODS.Gno, Brand, Price, amount, SDate
    FROM VEM, GOODS, SALES_Total
    WHERE ______ AND ______;   
【正确答案】VEMno,Gno,SDate
SALES_Detail(VEMno,Location,Gno,Brand,Price,amount,SDate)
VEM.VEMno=SALES_Total.VEMno
GOODS.Gno=SALES_Total.Gno
   注:后两空可互换
【答案解析】
问答题 3.  [问题3]
    每售出一件商品,就自动向销售单中添加一条销售记录。如果一天内某个售货机上某种商品的销售记录达到10条,则自动向缺货单中添加一条缺货记录。需要用触发器来实现缺货单的自动维护。程序中的GetTime()获取当前时间。
    CREATE ______ OOS_TRG AFTER ______ ON SALES
    REFERENCING new row AS nrow
    FOR EACH ROW
    BEGIN
    INSERT INTO OOS
    SELECT SALES.VEMno, ______, GetTime()
    FROM SALES
    WHERE SALES.VEMno = nrow.VEMno AND SALES.Gno = nrow. Gno
    AND SALES.SDate = nrow. SDate
    GROUP BY SALES.VEMno,  SALES.Gno,  SALES.SDate
    HAVING count(*)  > 0 AND mod(count(*),  10) = 0;
    END
【正确答案】TRIGGER
INSERT
SALES.Gno,SALES.SDate
【答案解析】
问答题 4.  [问题4]
    查询当天销售最多的商品编号、品牌和数量。程序中的GetDate()获取当天日期。
    SELECT GOODS.Gno,  Brand, ______
    FROM GOODS,  SALES
    WHERE GOODS.Gno = SALES.Gno AND SDate = GetDate()
    GROUP BY ______
    HAVING ______ ( SELECT count(*)
    FROM SALES
    WHERE SDate = GetDate()
    GROUP BY Gno );
【正确答案】count(*)
GOODS.Gno,Brand
count(*)>=ALL
【答案解析】
问答题 5.  [问题5]
    查询一件都没有售出的所有商品编号和品牌。
    SELECT Gno,  Brand
    FROM GOODS
    WHERE Gno ______ (
    SELECT DISTINCT Gno
    FROM ______);
【正确答案】NOT IN或<>ANY(注:两者填其一个即可)
SALES
【答案解析】
   本题考查SQL应用,是比较传统的题目,要求考生细心分析题目中所描述的内容。
   [问题1]
   本问题考查SOL数据定义语言DDL和完整性约束。
   完整性约束包括三类,实体完整性、参照完整性和用户定义的完整性。实体完整性约束规定关系的主属性不能取空值,关系模型中以主码作为唯一性标识;参照完整性约束规定:若属性(或属性组)A是关系R上的主码,B是关系S上的外码,A与B相对应(来自相同的域),则B取值为空或者来自于R上的某个A的值;用户定义的完整性约束是针对具体的数据库应用而定义的,它反映该应用所涉及的数据必须满足用户定义的语义要求。
   第一空考查实体完整性约束,Sno是SALES的主码,用关键字PRIMARY KEY约束。第二空和第三空考查参照完整性约束,VEMno属性参照VEM关系模式中的VEMno属性,Gno属性参照GOODS关系模式中的Gno属性,空白处分别填入“REFERENCESVEM(VEMno)”和“REFERENCESGOODS(Gno)”。
   [问题2]
   本问题考查SQL创建视图的操作及应用。
   需创建的第一个视图SALES Total(VEMno,Gno,SDate,amount)来自SALES表,属性分别对应SALES表中的VEMno、Gno、SDate、Count(*),其中,Count(*)要对SALES表中的VEMno、Gno、SDate进行分组计数,因此空第四空应填入“VEMno,Gno,SDate”。
   需要创建的第二个视图SALES_Detail基于第一个已经创建的视图SALES_TOTAL和基本表VEM、GOODS。因此只需要把题意中需要统计的VEMno、Location、Gno、Brand、Price、amount、SDate从上述三个表中提取出来即可。第五空应填入“SALES_Detail(VEMno,Location,Gno,Brand,Price,amount,SDate)”。
   WHERE条件后需要将三个表按照公共属性列连接起来,因此第五空和第七空分别填入“VEM.VEMno=SALES_Total.VEMno”和“GOODS.Gno=SALES_Total.Gno”即可(顺序可以互换)。
   [问题3]
   本问题考查触发器的设计与应用。
   触发器是一个能由系统自动执行对数据库修改的语句。一个触发器由三部分组成:①事件,即对数据库的插入、删除和修改等操作。触发器在这些事件发生时,将开始工作:②条件,触发器将测试条件是否成立,若成立就执行相应的动作,否则就什么也不做;③动态,若触发器测试满足预定的条件,那么就由数据库管理系统执行这些动作。本题判断销售记录达到10条,则自动向缺货单中添加一条缺货记录。因此第八空处应填入“TRIGGER”,第九空处应填入“INSERT”,而第十空处应填入SALES表中的两个必要属性“SALES.Gno”和“SALES.SDate”。
   [问题4]
   本问题考查SQL的查询操作。
   题意要求查询当天销售最多的商品编号、品牌和数量。SELECT语句后缺少数量,可以用count(*)来对分组后的商品销售数量进行统计。GROUP BY分组条件是商品号和品牌的组合,也就是GOODS.Gno和Brand。需要统计销售最多的商品,只需要在嵌套子查询前面使用count(*)>=ALL即可达到目的。
   [问题5]
   本问题考查SQL的查询操作。
   题意要求查询一件都没有售出的所有商品编号和品牌,因此外层查询的Gno不在销售表中即可,第十一空处应填“NOTIN”或“<>ANY”。内层子查询统计的Gno来自于销售表SALES,因此第十二空处应填“SALES”。