作为一个存在谓词,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中没有全称量词时怎么通过存在量词转化从而解决全称量词的问题:
如:查询选修了全部课程的学生姓名
转化为:不存在(没有)一门课程是它不选修的