理解SQL中的NOT EXISTS

时间:2017-04-30 06:49:20

标签: sql sql-server

enter image description here

我是SQL的初学者。我现在正在学习EXISTS而不是EXESTS。

问题:

  

检索处理所有项目的每个员工的姓名   由部门5控制。

答案:

select fname, lname
from employee
where not exists ( (select pnumber from project where dnum = 5)
                   MINUS 
                   (select pno from works_on where essn = ssn)
                 );

子查询中的第一个选择为(1,2,3),第二个选择为(1,2,3,10,20,30)。所以(1,2,3) - (1,2,3,10,20,30) = 0。这是如何解决查询的?我不确定我的逻辑是否正确或我解决问题的方式。

有人可以帮我逐步理解解决方案吗?感谢

Link to the course

2 个答案:

答案 0 :(得分:1)

所以,最初的问题是:

  

检索处理由部门5控制的所有项目的每个员工的姓名。

提供的答案使用了等价:

  1. 所有x使得f(x)
  2. 否x使得不是f(x)
  3. 用英语表示,问题相当于找到那些没有由部门5控制的项目的员工,而该员工没有工作。

    因此,首先找到由部门5控制的所有项目,然后从该员工处理的任何项目中删除。这正是提供的答案所做的。如果没有任何东西,那么部门5没有控制该员工不工作的项目。因此,通过等值,员工可以处理该部门控制的所有项目。

    虽然这在技术上是正确的,但它可能会有点奇怪。特别是如果部门5控制零项目的话。如果这是真的,那么查询将返回所有员工......这可能不是预期的结果。

答案 1 :(得分:0)

首先,MINUS是Oracle术语。 SQL-Server使用EXCEPT。有关详细信息,请阅读https://blog.sqlauthority.com/2008/08/07/sql-server-except-clause-in-sql-server-is-similar-to-minus-clause-in-oracle/

其次,EXISTS根据参数语句是否返回任何记录返回TRUEFALSE结果。例如,EXISTS ( SELECT * FROM Employee WHERE Fname = 'John' )将返回TRUE,而EXISTS ( SELECT * FROM Employee WHERE Fname = 'Slartibartfast' )将返回FALSE

https://www.w3schools.com/sql/sql_exists.asp给出EXISTS的良好解释(带示例)。

EXISTS子查询不需要引用主语句 - 它只需要在与EXISTS返回TRUE时相同的情况下返回至少一条记录。例如......

SELECT *
FROM Employee
WHERE Dno = 5
  AND EXISTS ( SELECT Sex
               FROM employee
               WHERE Sex = 'M'
                 AND Dno = 5 )

如果Employee至少有一个人Sex,此查询将返回Dno的所有记录(无论他们5如何)Department Sex = 'M' {1}}。

至于NOT EXISTS ......

SELECT *
FROM Employee
WHERE Dno = 5
  AND NOT EXISTS ( SELECT Sex
                   FROM employee
                   WHERE Sex = 'M'
                     AND Dno = 5 )

如果Employee 没有Sex的所有记录(无论Dno5 Department) em> Sex = 'M'的人。

如果您有任何问题或意见,请随时发表评论。