【学习笔记之数据库系统工程师】2017上半年下午试题四

阅读下列说明,回答问题 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

请将下面创建销售单表的 SQL 语句补充完整,要求指定关系的主码和外码约束。
CREATE TABLE SALES(
Sno CHAR(8) (a)
VEMno CHAR(5) (b)
Gno CHAR(8) ( c )
SDate DATE,
STime TIME);

答案:
(a)PRIMARY KEY
(b)REFERENCES VEM(VEMno)
( c)REFERENCES GOODS(Gno)

CREATE TABLE SALES(
Sno CHAR(8) (a)
VEMno CHAR(5) (b)
Gno CHAR(8) ( c ) 
SDate DATE,
STime TIME
);

分析:
(b、c)根据题目分析,这两个空应该是外键

问题: 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 VENno ,Gno ,SDate ,count(*)
FROM SALES
GROUP BY (d);

CREATE VIWE (e) AS
SELECT VEM.VEMno , Location , GOODS.Gno , Brand , Price , amount , SDate
FROM VEM , GOODS , SALES_Total
WHERE (f) AND (g)

答案:
(d)VEMno , Gno , SDate
(e)SALES_Detail(VEMno , Location , Gno , Brand , Price , Amount , SDate)
(f)VEM.VEMno=SALES_Total. VEMno
(g)GOODS.Gno= SALES_Total. Gno

CREATE VIEW SALES _Total(VEMno,Gno,SDate,amount) AS
SELECT VENno ,Gno ,SDate ,count(*)
FROM SALES
GROUP BY (d);
CREATE VIWE (e) AS
SELECT VEM.VEMno , Location , GOODS.Gno , Brand , Price , amount , SDate
FROM VEM , GOODS , SALES_Total
WHERE (f) AND (g) 

分析:
(d)‘’要求按日期统计每个售货机上各种商品的销售数量,‘’可知要先把日期、售货机编号、商品编号分组,才能进行统计。
(f、g)‘’利用 SALES_Total 完成视图 SALES_Detail的定义,‘’可知要进行笛卡尔积的运算,才能找到自己想要的。

问题: 3

每售出一件商品,就自动向销售单中添加一条销售记录。如果一天内某个售货机上某种商品的销售记录达到 10 条,则自动向缺货单中添加一条缺货记录。需要用触发器来实现缺货单的自动维护。程序中的 GetTime()获取当前时间。
CREAT(h) OOS_TRG AFTER (i) ON SALES
REFERENCING new row AS nrow
FOR EACH ROW
BEGIN
INSERT INTO OOS
SELECT SALES .VENno, (j) 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()> 0ANDmod(count(), 10)=0;
END

答案:
(h)TRIGGER
(i)INSERT
(j)SALES.Gno , SALES.SDate

分析:

CREAT(h) OOS_TRG AFTER (i) ON SALES
REFERENCING new row AS nrow
FOR EACH ROW
BEGIN
INSERT INTO OOS
SELECT SALES.VENno, (j) 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(*)> 0ANDmod(count(*)10)=0;
END

(h、i)触发器来实现缺货单的自动维护,触发器的定义,由‘’每售出一件商品,就自动向销售单中添加一条销售记录。‘’可知启动触发器的条件是插入。

问题: 4

查询当天销售最多的商品编号、品牌和数量。程序中的 GetDate()获取当天日期。
SELECT GOODS.Gno , Brand , (k)
FROM GOODS,SALES
WHERE GOODS.Gno=SALES.GNO AND SDATE =GetDate()
GROUP BY (l)
HAVING(M) (SELECT count(*)
FROM SALELS
WHERE SDATE = GetDate()
GROUP BY Gno);

答案:
(k)COUNT( * ) AS 数量
(l)GOODS.Gno , Brand
(m)COUNT( * )>=ALL

分析:

SELECT GOODS.Gno , Brand , (k)
FROM GOODS,SALES
WHERE GOODS.Gno=SALES.GNO AND SDATE =GetDate()
GROUP BY (l)
HAVING(M) (
	SELECT count(*)
	FROM SALELS
	WHERE SDATE = GetDate()
	GROUP BY Gno
);

(l)‘’查询当天销售最多的商品编号、品牌和数量‘’就知道他要分组商品编号和品牌名

问题: 5

查询一件都没有售出的所有商品编号和品牌。
SELECT Gno ,Brand
FROM GOODS
WHERE GNO(N)
SELECT DISTINCT GNO
FROM(o);

答案:
(n)NOT IN
(o)SALES

分析:

SELECT Gno ,Brand
FROM GOODS
WHERE GNO(N)
	SELECT DISTINCT GNO
	FROM(o);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IsQiya

很庆幸我的文章对您有帮助

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值