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)