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

阅读下列说明,回答问题 1 至问题 4 ,将解答填入答题纸的对应栏内。
【说明】
某汽车租赁公司建立汽车租赁管理系统,其数据库的部分关系模式如下:
用户: USERS( Userid , Name , Balance),各属性分别表示用户编号、姓名、余额;
汽车: CARS(Cid , Ctype , CPrice , CStatus)各属性分别表示汽车编号、型号、价格(日租金)、状态;
租用记录: BORROWS(BRid , Userid , Cid , STime , ETime),各属性分别表示租用编号、用户编号、汽车编号、租用时间、归还时间;
不良记录: BADS(Bid , Userid . BRid , BTime),各属性分别表示不良记录编号、用户编号、租用编号、不良记录时间。

相关关系模式的属性及说明如下
(1) 用户租用汽车时,其用户表中的余额不能小于 500 ,否则不能租用。
(2) 汽车状态为待租和已租,待租汽车可以被用户租用,已租汽车不能租用。
(3) 用户每租用一次汽车,向租用记录中添加一条租用记录,租用时间默认为系统当前时间,归还时间为空值,并将所租汽车状态变为已租。用户还车时,修改归还时间为系统当前时间,并将该汽车状态改为待租。要求用户不能同时租用两辆及以上汽车.
(4) 租金从租用时间起按日自动扣除.
根据以上描述,回答下列问题,将 SQL 语句的空缺部分补充完整。

问题: 1

请将下面建立租用记录表的 SQL 语句补充完整,要求定义主码完整性约束和引用完整性约束。
CREATE TABLE BORROWS(
BRID CHAR(20) (a) ,
UserId CHAR(10) (b) ,
Cld CHAR(10) (c ) ,
STime DATETIME (d) ,
ETime DATETIME,
);

答案:
(a) PRIMARY KEY
(b) REFERENCES USERS(UserId)
(c ) REFERENCES CARS(CId)
(d) DEFAULT NOW() 或DEFAULT GETDATE()

CREATE TABLE BORROWS(
BRID CHAR(20) (a) ,
UserId CHAR(10) (b) ,
Cld CHAR(10) (c ) ,
STime DATETIME (d) ,
ETime DATETIME,
);

分析:
(d) DEFAULT约束

问题: 2

当归还时间为空值时,表示用户还未还车,系统每天调用事务程序从用户余额中自动扣除当日租金,每个事务修改一条用户记录中的余额值。由用户表上的触发器实现业务:如用户当日余额不足,不扣除当日租金,自动向不良记录表中加入一条记录,记录中的 BId 取值由 UserId +系统当前日期构成, Btime采用 GETDATE()函数取系统当前时间。补全创建触发器 Bad_TRG 的 SQL 语句。
CREATE TRIGGER Bad_TRG (e) UPDATE of Balance ON USERS
Referencing new row as nrow
For each row
When nrow.Balance<0
BEGIN
(f) ;
//插入不良记录
INSERT INTO BADS
SELECT CONCAT(BORROWs. UserId, CONVERT(varchar(100),
GETDATE(), 10)), BORROWS UserId, BRID, (g)
// CONVERT()函数将日期型数据改为字符串型
// CONCAT()函数实现字符串拼接
FROM BORROWS
WHERE (h) AND ETime IS NULL;
END

答案:
(e) BEFORE
(f) default GETDATE()
(g) GETDATE()
(h) nrow.UserId = BORROWS.UserId

CREATE TABLE BORROWS(
BRID CHAR(20) (a) ,
UserId CHAR(10) (b) ,
Cld CHAR(10) (c ) ,
STime DATETIME (d) ,
ETime DATETIME,
);

分析:
(e) 触发器

问题: 3

不良记录是按日记录的,因此用户一次租车可能会产生多条不良记录。创建不良记录单视图 BADS_Detail ,统计每次租车产生的不良记录租金费用总和大于 200 的记录,属性有UserId 、 Name 、 BRId 、 CId 、 Stime 、 Etime 和 total(表示未缴纳租金总和)。补全创建视图 BADS_Detail 的 SQL 语句。
CREATE VIEW (i) AS
SELECT BADS. UserId, USERS. Name, BADS.BRId, CARS. Cld, Stime, Etime,
(j) AS total
FROM BORROWS BADS. CARS. USERS
WHERE BORROWS.BRId=BADS. BRId
AND BORROWS.Cid=CARS. Cld
AND (k) =BADS. UserId
GROUP BY BADS. UserId, USERS. Name, BADS.BRID, CARS. CId, Stime, Etime
HAVING (l) ;

答案:
(i) BADS_Detail(UserId 、 Name 、 BRId 、 CId 、 Stime 、 Etime 、 total)
(j) Cout() * CARS.CPrice
(k) USERS.UserId
(l) Cout(
) * CARS.CPrice> 200

CREATE VIEW (i) AS
SELECT BADS. UserId, USERS. Name, BADS.BRId, CARS. Cld, Stime, Etime,
(j) AS total
FROM BORROWS BADS. CARS. USERS
WHERE BORROWS.BRId=BADS. BRId
AND BORROWS.Cid=CARS. Cld
AND (k) =BADS. UserId
GROUP BY BADS. UserId, USERS. Name, BADS.BRID, CARS. CId, Stime, Etime
HAVING (l) ;

问题: 4

查询租用了型号为“A8”且不良记录次数大于等于 2 的用户,输出用户编号、姓名,并按用户姓名降序排序输出。
SELECT USERS. UserId, Name
FROM USERS , BORROWS, CARS
WHERE USERS. UserId= BORROWS. UserId AND BORROWS.Cid= CARS. CId
AND (m) AND EXISTS(
SELECT * FROM BADS
WHERE BADS. UserId=BORROWS.UserId AND (n)
GROUP BY UserId
HAVING COUNT(*)>= 2)
ORDERBY (O) ;

答案:
(m) CARS.Ctype = ‘A8’
(n) BADS.BRId = BORROWS.BRId
(o) Name DESC

SELECT USERS. UserId, Name
FROM USERS , BORROWS, CARS
WHERE USERS. UserId= BORROWS. UserId AND BORROWS.Cid= CARS. CId
AND (m) AND EXISTS(
SELECT * FROM BADS
WHERE BADS. UserId=BORROWS.UserId AND (n)
GROUP BY UserId
HAVING COUNT(*)>= 2)
ORDERBY (O)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

IsQiya

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

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

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

打赏作者

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

抵扣说明:

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

余额充值