第3章 SQL 习题 - 3.8

3.8考虑下图中的银行数据库,其中加下划线的是主码。为这个关系数据库构造出如下SQL查询:

branch(branch_name, branch_city, assets)
customer(customer_name, customer_street, customer_city)
loan(loan_number, branch_name, amount)
borrower(customer_name, loan_number)
account(account_number, branch_name, balance)
depositor(customer_name, account_number)

为了解题方便,先创建这些关系,并填充一些样例数据。

drop table if exists branch cascade;
drop table if exists customer cascade;
drop table if exists loan cascade;
drop table if exists borrower cascade;
drop table if exists account cascade;
drop table if exists depositor cascade;
create table branch(
    branch_name varchar not null, -- '支行名称', 
    branch_city varchar , -- '所在城市', 
    assets numeric(18,2) DEFAULT '0.00' , -- '账户余额',
    PRIMARY KEY(branch_name)
);
create table customer(
    customer_name varchar not null , -- '客户名称', 
    customer_street varchar , -- '居住街道', 
    customer_city varchar , -- '居住城市',
    primary key(customer_name)
);
create table loan(
    loan_number varchar , -- '贷款号', 
    branch_name varchar , -- '支行名称', 
    amount numeric(18, 2) , -- '贷款金额',
    primary key (loan_number),
    foreign key (branch_name) references branch on delete no action
);
create table borrower(
    customer_name varchar , -- '客户名称', 
    loan_number varchar , -- '贷款号',
    primary key (customer_name, loan_number),
    foreign key (customer_name) references customer on delete no action,
    foreign key (loan_number) references loan on delete no action
);
create table account(
    account_number varchar , -- '账户号', 
    branch_name varchar , -- '支行名称', 
    balance numeric(18,2) , -- '账户金额',
    primary key (account_number),
    foreign key (branch_name) references branch on delete no action
);
create table depositor(
    customer_name varchar , -- '客户名称', 
    account_number varchar , -- '账户号',
    primary key (customer_name, account_number),
    foreign key (customer_name) references customer on delete no action,
    foreign key (account_number) references account on delete no action
);

insert into branch values ('银行支行_1', '北京', 66666);
insert into branch values ('银行支行_2', '北京', 77777);
insert into branch values ('银行支行_3', '北京', 88888);
insert into branch values ('银行支行_4', '北京', 99999);

insert into customer values ('客户_1', '中关村北大街', '北京');
insert into customer values ('客户_2', '西二旗软件园', '北京');
insert into customer values ('客户_3', '回龙观', '北京');
insert into customer values ('客户_4', '西二旗软件园', '北京');
insert into customer values ('客户_5', '回龙观', '北京');
insert into customer values ('客户_6', '中关村北大街', '北京');
insert into customer values ('客户_7', '上地环岛', '北京');
insert into customer values ('客户_8', '上地环岛', '北京');

insert into loan values ('贷款号_1', '银行支行_1', 120);
insert into loan values ('贷款号_2', '银行支行_1', 230);
insert into loan values ('贷款号_3', '银行支行_3', 345);
insert into loan values ('贷款号_4', '银行支行_4', 139);
insert into loan values ('贷款号_5', '银行支行_1', 233);
insert into loan values ('贷款号_6', '银行支行_2', 45);
insert into loan values ('贷款号_7', '银行支行_3', 65);
insert into loan values ('贷款号_8', '银行支行_4', 12345);

insert into borrower values ('客户_1', '贷款号_1');
insert into borrower values ('客户_6', '贷款号_2');
insert into borrower values ('客户_3', '贷款号_3');
insert into borrower values ('客户_8', '贷款号_4');
insert into borrower values ('客户_1', '贷款号_5');
insert into borrower values ('客户_6', '贷款号_6');
insert into borrower values ('客户_2', '贷款号_7');
insert into borrower values ('客户_7', '贷款号_8');

insert into account values ('账户_1', '银行支行_1');
insert into account values ('账户_2', '银行支行_3');
insert into account values ('账户_3', '银行支行_3');
insert into account values ('账户_4', '银行支行_4');
insert into account values ('账户_5', '银行支行_1');
insert into account values ('账户_6', '银行支行_1');
insert into account values ('账户_7', '银行支行_4');
insert into account values ('账户_8', '银行支行_4');
insert into account values ('账户_9', '银行支行_2');

insert into depositor values ('客户_1', '账户_1');
insert into depositor values ('客户_1', '账户_9');
insert into depositor values ('客户_2', '账户_2');
insert into depositor values ('客户_3', '账户_3');
insert into depositor values ('客户_4', '账户_4');
insert into depositor values ('客户_5', '账户_5');
insert into depositor values ('客户_6', '账户_6');
insert into depositor values ('客户_7', '账户_7');
insert into depositor values ('客户_8', '账户_8');

a.找出银行中所有有账户但无贷款的客户;

(select customer_name from depositor)
except
(select customer_name from borrower);
 customer_name 
---------------
 客户_5
 客户_4
(2 rows)

b.找出与"Smith"居住在同一个城市、同一个街道的所有客户的名字。

咱们的样本数据里没有叫smith的客户,假设查找叫“客户_4”的客户吧。

with target_customer as (
	select customer_street, customer_city from customer
	where customer_name = '客户_4'
)
select * from customer natural join target_customer;
 customer_street | customer_city | customer_name 
-----------------+---------------+---------------
 西二旗软件园    | 北京          | 客户_2
 西二旗软件园    | 北京          | 客户_4
(2 rows)

c.找出所有支行的名称,在这些支行中都有居住在"Harrison"的客户所开设的账户。

假设查找居住在“回龙观”的客户吧。

with target_account as (
	select account_number 
	from customer natural join depositor
	where customer_street = '回龙观'
)
select distinct branch_name from account natural join target_account;
 branch_name 
-------------
 银行支行_1
 银行支行_3
(2 rows)

猜你喜欢

转载自blog.csdn.net/zhangyingli/article/details/84101958
3.8