1. 程式人生 > >第3章 SQL 習題 - 3.4

第3章 SQL 習題 - 3.4

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)。

我們資料庫中沒有這條資料,換一下,刪除“劉二”擁有的“別克君越”。為了實現這個需求,我們先來檢查一下劉二是否確實擁有別克君越。使用如下命令檢視,果然存在關係。

下面開始刪除它,再同時檢查還存不存在擁有關係,如果沒有,則說明刪除成功了。