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)


题目是查找在“Brooklyn”的所有支行都有账户的所有客户,SQL语句如下:

withbranchcountas
(select count(*)
branch
where branch city= ’Brooklyn’)
select customer name
from customer c
where branchcount=
(select count(distinctbranch name)
from (customernatural joindepositor natural join account
natural join branch)as d
where d.customer name = c.customer name and d.branch_city='Brooklyn')

我们来理解一下这个查询语句:

第一步:找出在Brooklyn这个市所有支行的数目。
第二步:以客户姓名为等值条件连接四个表,也就是查出所有用户的开户情况,看这些用户在'Brooklyn'市的哪些支行开了户,并去除重复的支行的名字
最后:与Brooklyn支行数目做对比,拥有与该市支行数目相等的就是在Brooklyn所有支行都开过户的客户。

当然,该类问题还可用第二种方式来写,用两层not exists嵌套循环的双重否定也可表达,即“Brooklyn市不存在这样的支行,待查找的客户没有在该支行开过户”。

是不是有点被绕晕了,我也是,多捋几遍或许就被洗脑了,发现诶好像是这么回事,哈哈哈。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值