《用实例学习SQL》专题篇:带有(not)exists 谓词的子查询(1)

相关表

作为一个存在谓词,exists在条件筛选结果中返回的结果只有True和False。

exists的用法

select * 
from table1
where exists
		(select * 
		from table2);
#当子查询的结果不是空时,exists返回True,否则返回False

not exists的用法

select *
from table1
where exists
		(select *
		from table
		where table.colunm > 10);  (注:table2表中属性列column的值都小于10)
# 从注释可以看出,子查询的结果肯定是空的
# not exists的返回结果与exists正好相反,也就是说,当子查询的结果是空的时候not exists返回的结果是True,不是空的时候返回的是False

好,那么,exists怎么在执行它的筛选作用呢?
先用文字表述,然后再用例子说明:

从父查询中取出一个元组,该元组的某个属性值,作为参考值放在子查询中,如果子查询表中有一个元组的对应属性值与该参考值相等,且该元组符合子查询的条件,那么,该父查询的元组就是结果元组之一,否则就不是

例子:

select *
from table1
where exists
		(select * 
		from table2
		where table2.Sno = table1.Sno and table2.Cno = '1');
# 下面结合例子来说明

上例中:先从table1表中取出一个元组①,然后将该元组①的Sno属性值(parameter)传进子查询中,在子查询table2表中找到Sno值与parameter值相同的元组②(可能不止一个),如果这些元组②中有属性值Cno等于‘1’的,那么子查询的结果就不是空,返回True,那么元组①就作为一个结果元组。
重复进行上述过程,直到比较了父查询中的所有元组。

下篇我会讲到当SQL中没有全称量词时怎么通过存在量词转化从而解决全称量词的问题:
如:查询选修了全部课程的学生姓名
转化为:不存在(没有)一门课程是它不选修的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值