终于学会有exists谓词的嵌套查询了

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


一、概念

对于带有exists谓词的子查询,首先要明确几点:

第一,exists谓词出现在where子句中,其后的子查询在理解时,可以看做隐含有对from子句中基本表的遍历过程;
第二,exists谓词后面的子查询不返回任何数据,只产生逻辑值true或false;
第三,由于子查询不返回元组,因此其select子句无意义,都写为*;

综合以上三条,我们在分析时可以形象的把查询过程描述为:

首先对于from基本表中的每个元组,检查是否符合子查询的where条件,若符合则返回1,并将此元组的相应属性放入结果表中(具体哪个属性要看主查询的select中),若不符合则返回0,再看下一个元组,直至将主查询中from子句后的基本表中的元组遍历一遍,该查询结束。

简言之,可以形象的把一个带有exists谓词的子查询当做一个遍历循环,每次遍历传入的参数一般为外层嵌套的表的主码。

二、例题

1.问

题目如下:

设有如图3所示的三个关系。其中各个属性的含义如下:
表A:商店信息
ANO, ANAME, WQTY, CITY
101, 韶山书店, 15, 长沙
204, 前门商店, 89, 北京
256, 东风商场, 501, 北京
345, 铁道商店, 76, 长沙
620, 第一百货公司, 413, 上海

表B:商品信息
BNO, BNAME, PRICE
1, 毛笔, 21
2, 羽毛球, 4
3, 收音机, 325
4, 书包, 242

表AB:商店-商品对应关系
ANO, BNO, QTY
101, 1, 105
101, 2, 42
101, 3, 25
101, 4, 104
204, 3, 61
256, 1, 241
256, 2, 91
345, 1, 141
345, 2, 18
345, 4, 74
620, 4, 125

用SQL语言写出下列查询:找出至少供应了代号为‟256‟的商店所供应的全部商品的其它商店的商店名和所在城市。

2.答

首先,抛开最后的属性选择,题目就是要找出一些“其他商店”(不包括256),这些“其他商店”至少供应了256商店供应的全部商品,即,不存在这样的商店,商店里的商品在256中供应了,而没有在“其他商店”中供应。很明显需要用到嵌套查询中带有exist谓词的子查询

针对这道题,首先将问题转化为“(不)存在…”这样的句子,然后确定嵌套谓词选用exists还是not exists,最后确定每个子句的基本表即可。

因此,对于这道题有以下查询语句:在这里插入图片描述

源码如下可以自己尝试~

SELECT ANAME,CITY FROM A --遍历每个商店,商店标示为A.A#
WHERE NOT EXISTS( --不存在
			SELECT * FROM B WHERE EXISTS --遍历每个商品,商品标识为B.B#
			(--存在这样的商品,256供应
					SELECT * FROM AB AB1 --遍历每个供应记录
					WHERE A#='256' AND B#=B.B# 
					--在供应表中找到商店号为256而商品号为b#的返回1,说明此商品256商店有卖,然后执行下一个嵌套
			)
			AND NOT EXISTS
			(--而“商店A.A#不供应”
					SELECT * FROM AB AB2 --遍历每个供应记录,
					WHERE A#!='256' AND A#=A.A# AND B#=B.B#-
					-在供应表中找到商店号不为256,且为A.A#的,且有卖商品号为B.B#的商品的商店,返回0
			) 
);

3.再问

再来看另一个例子:基于经典的“学生课程数据库”中的三个表Student,Course,SC,检索选修课程包含王老师所授课程的学生学号。

4.再答

①转换问题:有这样一些学生,不存在这样一些课程,王老师教授了但他们没选。
②确定嵌套谓词结构 ,根据①可知,应是最外层的not exists 套内层的条件和not exists ,其中内层的条件 和not exists用AND 连接。
③确定每个子句的基本表,写出语句如下:

SELECT Sno FROM Student
WHERE NOT EXISTS
(
		SELECT * FROM Course WHERE 
		teacher='王老师'
		AND NOT EXISTS
		(
				SELECT * FROM SC WHERE 
				Sno=Student.sno AND Cno=Course.cno
		)			
)

查询结果如下:
在这里插入图片描述
ε=(´ο`*)))唉有的时候觉得自己很fw但是有的时候又觉得我还蛮厉害的这都能学会(bushi)

  • 17
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值