交集和差集的查询:EXISTS

使用关键字 EXISTS 引入子查询可以将该子查询用作存在性测试,即测试是否存在满足子查询准则的数据。如果子查询返回的结果是空集,则判断为不存在,即 EXISTS失败,NOT EXISTS 成功。如果子查询返回至少一行的数据记录,则判断为存在,即
EXISTS 成功,NOT EXISTS 失败。 
      关键字 EXISTS 引入子查询的语法有所特别: 
●  关键字 EXISTS 一般直接跟在外围查询的 WHERE 关键字后面。它的前面没有列名、常量或者表达式; 
●  关键字 EXISTS 引入的子查询的 SELECT 列表清单可以而且通常都是由星号 “*”组成的。因为我们只是测试满足子查询的数据行的存在性,在子查询的 SELECT列表清单中加入列名没有实际意义。 
      将关键字 EXISTS 与无关子查询一起使用的意义不大,如果这么做,作用仅仅是子查询返回空值,外围查询返回的结果也就为空,如果子查询返回非空值,外围查询就会返回所有外层表的数据行。所以实际上,EXISTS 通常都和相关子查询一起使用。我们
知道,在使用相关子查询时,对外表中的每一行,子查询都要运行一遍,该行的值也要在子查询的 WHERE 子句中被使用。这样,我们通过 EXISTS 子句就能将外层表中的各行数据依次与子查询处理的内层表中的数据进行存在性比较,得到我们需要的结果。下
面我们就要为大家介绍如何使用关键字EXISTS和相关子查询来查找两个表的交集和差集。 
       两个集合的交集是指同属于这两个集合中的元素所构成的集合,而差集则是指这两个集合中的只属于第一个集合的元素所构成的集合。下面我们举一些例子来说明如何使用关键字(NOT) EXISTS 来查找交集和差集。 
       例如,我们想查找有负责过具体项目的部门经理,就需要在部门表 Department 的mgrid 列和项目表 Project 的 pmgrid 列上查找交集: 

SELECT DISTINCT mgrid manager_id 
FROM Department d 
WHERE EXISTS 
     (SELECT * 
FROM Project 
WHERE d.mgrid = pmgrid) 
ORDER BY mgrid 

Results 
Manager_id  
————  
1001 
4001 
[2rows] 

如果,我们想查找的是有负责过具体项目但不是部门经理的员工,就需要查找项目表 Project 的 pmgrid 列和部门表 Department 的 mgrid 列上的差集: 

SELECT DISTINCT pmgrid 
FROM Project p 
WHERE NOT EXISTS 
     (SELECT * 
FROM Department 
WHERE mgrid = p.pmgrid) 
ORDER BY pmgrid 

Results 
pmgrid  
———— 
1002 
1004 
4003 
4004 
[4rows] 

或者我们希望查找的是没有负责过任何项目,也不是部门经理的公司员工,这样我们就要查找员工表Employee的id列和项目表Project的pmgrid列以及部门表Department的 mgrid 列的差集(表 Employee、Department 和 Project 见附录 I): 

SELECT DISTINCT name Worker_name, id Worker_id 
FROM Employee e 
WHERE NOT EXISTS 
       (SELECT * 
FROM Project p, Department d 
WHERE e.id = p.pmgrid OR 
e.id = d.mgrid) 
ORDER BY id 

Results 
Worker_name   Worker_id  
—————    —— 
李大平        1003 
庞文凯        1005 
刘燕          2002 
林志祥        2003 
吴忠彦        3002 
魏箐          3003 
王静          3004 
张敏燕        4002 
林雪飞        4005 
姜艳成        4006 
梁朝阳        5002 
王力刚        5003 
余文惠        5004 
陈志强        6002 
[14rows] 
文章转自:
http://www.dnew168.com/thread-1767-1-1.html

猜你喜欢

转载自myboy123.iteye.com/blog/1628263
今日推荐