关于exists运算符的理解

 

exists运算符是用来检查每一行是否匹配子查询,也可以这么认为exists就是用来测试子查询的结果是否为空,如果结果集为空则匹配结果为False,否则匹配结果为True。

下面我通过oracle表举几个例子,下面我给出三张表,T_Book,T_Category,T_Reader。

T_Book的字段: FId,FName,FYearPublished,FCategoryId

T_Category的字段: FId,FName

T_Reader的字段: FId,FName,FYearOfBirth,FCity,FProvince,FYearOfJoin

查询条件:测试是否存在山东省的读者

select * from T_Book where exists
(
   select * from T_Reader where fprovince='ShanDong'
)

这句SQL语句对T_Book表中的每行数据进行匹配,测试是否存在山东省的读者!如果匹配则返回数据,不过不匹配则不返还数据!

 执行结果如下:

 

其实上面这个列子在实际中并不常用,EXISTS运算符只有和相关子查询一起使用才更有意义,在相关的子查询中引用外部查询中的这个字段,这样在匹配外部

子查询中的每行数据的时候,相关子查询就会根据当前行的信息来进行匹配判读,这样就可以实现丰富的功能。

条件:检索在1950年以前出版的图书的图书类别:

select * from T_Category a where exists
(
   select * from T_Book  where a.fid=T_Book.Fcategoryid
   and T_Book.Fyearpublished<1950
   
)

这句SQL对T_Category表中的每一行数据进行匹配,测试T_Book表中是否在FCategoryId字段值等于当前类别主键值且出版年份在1950年之前的书籍。

结果:

 

 

posted @ 2012-11-28 12:17  大麦种子  阅读(444)  评论(0编辑  收藏  举报
4