基于mysql 的exists 嵌套查询的详解

select Sname from Student 
	where not exists 
		(select * from Course 
		        where not exists 
			     (select * from SC 
			             where 
			                Sno=Student.Sno 
			                and 
			                Cno=Course.Cno));

学习sql的时候碰到这货,有点难理解,问度娘找谷哥,终于明白...记录如下:

一、表的结构和数据如下:

Student:


Course:


SC:


二、SQL语句执行过程:

1、sql 结构分析

主查询:select Sname from Student;

嵌套 主查询:select * from Course...

嵌套 子查询:select * from SC where Sno=Student.Sno and Cno=Student.Cno;

关键字:not exists

2、执行过程:

注意:下表中以主键代表该条记录

步骤主查询 记录嵌套 主查询 记录嵌套 子查询嵌套主查询结果集主查询的结果记录
12002151211无匹配记录结果集为空200215121
22002151212无匹配记录200215121
32002151213无匹配记录200215121
42002151214无匹配记录200215121
52002151215无匹配记录200215121
62002151216无匹配记录200215121
72002151217无匹配记录200215121
82002151221有匹配记录结果集非空null
9......... ...
102002151227有匹配记录 null
112002151231有匹配记录结果集非空null
12...............
132002151237有匹配记录结果集非空null
142002151251有匹配记录结果集非空null
15...............
162002151257有匹配记录结果集非空null

由上图可知该查询语句的返回结果是:

附文字说明:

首先,将主查询的记录和嵌套 主查询的记录查出

然后,取主查询中的第一条记录,依次遍历嵌套 主查询的记录,替换嵌套子查询中的查询条件为Sno=‘200215121’ and Cno=k,(k=1,2,3,4,5,6,7);

取主查询中的第二条记录,依次遍历嵌套查询中的记录,替换嵌套子查询中的查询条件为Sno='200215122' and Cno=k,(k=1,2,3,4,5,6,7);

最后,记录嵌套 主查询为空的主查询记录,将这些记录构成一个结果集即为此查询语句的结果集。

三、总结

1、作为where 查询条件时,exists(结果集为空返回false,否则返回true)

not exists(结果集为空返回true,否则返回false)

2、相关子查询,用主查询的相关属性去替换子查询中的条件从而匹配主结果集

3、题目情景出自某教科书 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值