第3章 SQL 習題 - 3.4
阿新 • • 發佈:2018-11-19
3.4考慮圖3-18中的保險公司資料庫,其中加下劃線的是主碼。為這個關係資料庫構造出如下SQL查詢:
person(driver_id, name, address)
car(licence, model, year)
accident(report_number, date, location)
owns(driver_id, license)
participated(report_number, license, driver_id, damage_amount)
為了更好的驗證答案是否正確,我們建立一個數據庫insurance,新增幾個表,並且增加一些資料。
drop table person cascade; drop table car cascade; drop table accident cascade; drop table owns cascade; drop table participated cascade; -- 司機資訊 create table person( driver_id int not null, -- 駕駛證號 name varchar(20) not null, --姓名 address varchar(30) not null, --住址 primary key (driver_id) ); --車輛資訊 create table car( licence int not null, -- 行駛證號 model varchar(20), --車輛型號 year numeric(4, 0) check (year > 1970 and year < 2100), --生產日期 primary key(licence) ); --事故資訊 create table accident( report_number int not null, --事故號碼 day date, --日期 location varchar(30), --事故發生地 primary key(report_number) ); --車輛所屬資訊 create table owns( driver_id int not null, --駕駛證號 licence int,--行駛證號 primary key(driver_id), foreign key(driver_id) references person on delete cascade, foreign key(licence) references car on delete no action ); --報損情況 create table participated( report_number int, --事故號碼 licence int, --行駛證號 driver_id int, --駕駛證號 damage_amount int, -- 報損金額 primary key(report_number, licence), -- 一個事故可能包含2輛以上車輛,所以主碼應該是這兩個資訊的組合 foreign key(report_number) references accident on delete no action, foreign key(licence) references car on delete no action ); --建立7名司機 insert into person values(1, '張三','北京市朝陽區太陽宮中路1號'); insert into person values(2, '李四','北京市昌平區天通苑2號'); insert into person values(3, '王五','北京市海淀區西二旗軟體園3號'); insert into person values(4, '趙六','北京市朝陽區霞光裡4號'); insert into person values(5, '郭大','北京市昌平區回龍觀東大街5號'); insert into person values(6, '劉二','北京市海淀區中關村北大街6號'); insert into person values(7, '劉七','北京市海淀區上地東里7號'); --建立6輛車 insert into car values(1, '大眾途觀L', 2018); insert into car values(2, '大眾邁騰', 2017); insert into car values(3, '日產天籟', 2016); insert into car values(4, '豐田漢蘭達', 2015); insert into car values(5, '本田雅閣', 2014); insert into car values(6, '別克君越', 2013); --建立3起事故 insert into accident values(1, to_date('2009-11-09', 'YYYY-MM-DD'), '北京市朝陽區太陽宮南街'); insert into accident values(2, to_date('2014-11-10', 'YYYY-MM-DD'), '北京市海淀區上地七街'); insert into accident values(3, to_date('2018-11-11', 'YYYY-MM-DD'), '北京市昌平區回龍觀西大街'); --註冊車輛 insert into owns values(1, 1);insert into owns values(2, 2);insert into owns values(3, 3); insert into owns values(4, 4);insert into owns values(5, 5);insert into owns values(6, 6); --建立報損 insert into participated values(1, 1, 1, 1000);insert into participated values(1, 2, 2, 2000); insert into participated values(2, 3, 3, 3000);insert into participated values(2, 4, 4, 4000); insert into participated values(3, 5, 5, 5000);insert into participated values(3, 6, 7, 7000);
a.找出2009年其車輛出過交通事故的人員總數。
b.向資料庫中增加一個新的事故,對每個必需的屬性可以設定任意值。
insert into accident values(4, to_date('2010-11-12', 'YYYY-MM-DD'), '北京市昌平區天通苑西路');
c.刪除"John Smith"(約翰史密斯)擁有的馬自達車(Mazda)。
我們資料庫中沒有這條資料,換一下,刪除“劉二”擁有的“別克君越”。為了實現這個需求,我們先來檢查一下劉二是否確實擁有別克君越。使用如下命令檢視,果然存在關係。
下面開始刪除它,再同時檢查還存不存在擁有關係,如果沒有,則說明刪除成功了。