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

我们数据库中没有这条数据,换一下,删除“刘二”拥有的“别克君越”。为了实现这个需求,我们先来检查一下刘二是否确实拥有别克君越。使用如下命令查看,果然存在关系。

下面开始删除它,再同时检查还存不存在拥有关系,如果没有,则说明删除成功了。

猜你喜欢

转载自blog.csdn.net/zhangyingli/article/details/83957820