【說明】
某汽車租賃公司建立汽車租賃管理系統(tǒng),其數(shù)據(jù)庫的部分關系模式如下:
用戶:USERS(Userid,Name,Balance),各屬性分別表示用戶編號、姓名、余額;
汽車:CARS(Cid,Ctype,CPrice,CStatus)各屬性分別表示汽車編號、型號、價格(日租金)、狀態(tài);
租用記錄:BORROWS(BRid,Userid,Cid,STime,ETime),各屬性分別表示租用編號、用戶編號、汽車編號、租用時間、歸還時間;
不良記錄:BADS(Bid,Userid.BRid,BTime),各屬性分別表示不良記錄編號、用戶編號、租用編號、不良記錄時間。
相關關系模式的屬性及說明如下
(1)用戶租用汽車時,其用戶表中的余額不能小于500,否則不能租用。
(2)汽車狀態(tài)為待租和已租,待租汽車可以被用戶租用,已租汽車不能租用。
(3)用戶每租用一次汽車,向租用記錄中添加一條租用記錄,租用時間默認為系統(tǒng)當前時間,歸還時間為空值,并將所租汽車狀態(tài)變?yōu)橐炎?。用戶還車時,修改歸還時間為系統(tǒng)當前時間,并將該汽車狀態(tài)改為待租。要求用戶不能同時租用兩輛及以上汽車.
(4)租金從租用時間起按日自動扣除.
根據(jù)以上描述,回答下列問題,將SQL語句的空缺部分補充完整。
問題:4.1(4分)
請將下面建立租用記錄表的SQL語句補充完整,要求定義主碼完整性約束和引用完整性約束。
CREATETABLEBORROWS(
BRIDCHAR(20)(a),
UserIdCHAR(10)(b),
CldCHAR(10)(c),
STimeDATETIME(d),
ETimeDATETIME,
);
問題:4.2
(4分)
當歸還時間為空值時,表示用戶還未還車,系統(tǒng)每天調(diào)用事務程序從用戶余額中自動扣除當日租金,每個事務修改一條用戶記錄中的余額值。由用戶表上的觸發(fā)器實現(xiàn)業(yè)務:如用戶當日余額不足,不扣除當日租金,自動向不良記錄表中加入一條記錄,記錄中的BId取值由UserId+系統(tǒng)當前日期構成,Btime采用GETDATE()函數(shù)取系統(tǒng)當前時間。補全創(chuàng)建觸發(fā)器Bad_TRG的SQL語句。
CREATETRIGGERBad_TRG(e)UPDATEofBalanceONUSERS
Referencingnewrowasnrow
Foreachrow
Whennrow.Balance<0
BEGIN
(f);
//插入不良記錄
INSERTINTOBADS
SELECTCONCAT(BORROWs.UserId,CONVERT(varchar(100),
GETDATE(),10)),BORROWSUserId,BRID,(g)
//CONVERT()函數(shù)將日期型數(shù)據(jù)改為字符串型
//CONCAT()函數(shù)實現(xiàn)字符串拼接
FROMBORROWS
WHERE(h)ANDETimeISNULL;
END
問題:4.3(4分)
不良記錄是按日記錄的,因此用戶一次租車可能會產(chǎn)生多條不良記錄。創(chuàng)建不良記錄單視圖BADS_Detail,統(tǒng)計每次租車產(chǎn)生的不良記錄租金費用總和大于200的記錄,屬性有UserId、Name、BRId、CId、Stime、Etime和total(表示未繳納租金總和)。補全創(chuàng)建視圖BADS_Detail的SQL語句。
CREATEVIEW(i)AS
SELECTBADS.UserId,USERS.Name,BADS.BRId,CARS.Cld,Stime,Etime,
(j)AStotal
FROMBORROWSBADS.CARS.USERS
WHEREBORROWS.BRId=BADS.BRId
ANDBORROWS.Cid=CARS.Cld
AND(k)=BADS.UserId
GROUPBYBADS.UserId,USERS.Name,BADS.BRID,CARS.CId,Stime,Etime
HAVING(l);
問題:4.4(3分)
查詢租用了型號為“A8”且不良記錄次數(shù)大于等于2的用戶,輸出用戶編號、姓名,并按用戶姓名降序排序輸出。
SELECTUSERS.UserId,Name
FROMUSERS,BORROWS,CARS
WHEREUSERS.UserId=BORROWS.UserIdANDBORROWS.Cid=CARS.CId
AND(m)ANDEXISTS(
SELECT*FROMBADS
WHEREBADS.UserId=BORROWS.UserIdAND(n)
GROUPBYUserId
HAVINGCOUNT(*)>=2)
ORDERBY(O);