SQL中不存在理解

SQL中不存在理解,sql,sql-server,Sql,Sql Server,我是SQL的初学者。我现在正在研究存在和不存在 问题: 检索在所有项目上工作的每个员工的姓名 由第五部门控制 答复: 子查询中的第一个select给出1,2,3,第二个select给出1,2,3,10,20,30。所以1,2,3-1,2,3,10,20,30=0。这是如何解决查询的?我不确定我的逻辑是否正确,或者我处理问题的方式是否正确 如果可能的话,有人能帮助我一步一步地、直观地理解解决方案吗?谢谢 首先,负号是一个甲骨文术语。SQL Server使用除。请阅读更多信息 其次,EXISTS根据

我是SQL的初学者。我现在正在研究存在和不存在

问题:

检索在所有项目上工作的每个员工的姓名 由第五部门控制

答复:

子查询中的第一个select给出1,2,3,第二个select给出1,2,3,10,20,30。所以1,2,3-1,2,3,10,20,30=0。这是如何解决查询的?我不确定我的逻辑是否正确,或者我处理问题的方式是否正确

如果可能的话,有人能帮助我一步一步地、直观地理解解决方案吗?谢谢

首先,负号是一个甲骨文术语。SQL Server使用除。请阅读更多信息

其次,EXISTS根据parameter语句是否返回任何记录返回TRUE或FALSE结果。例如,EXISTS SELECT*FROM Employee,其中Fname='John'将返回TRUE,而EXISTS SELECT*FROM Employee,其中Fname='Slartibartfast'将返回FALSE

用例子很好地解释了存在的问题

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

SELECT *
FROM Employee
WHERE Dno = 5
  AND EXISTS ( SELECT Sex
               FROM employee
               WHERE Sex = 'M'
                 AND Dno = 5 )
如果该部门至少有一名性别为“M”的人员,则此查询将返回Dno 5中员工的所有记录,无论其性别如何

至于不存在

如果该部门没有性别为“M”的人员,则此查询将返回Dno 5的所有员工记录,无论其性别如何


如果您有任何问题或意见,请随时发表相应的意见。

因此,最初的问题是:

检索在第5部门控制的所有项目上工作的每位员工的姓名

所提供的答案使用了以下等价物:

所有x都是这样的 没有x,因此没有fx 用英语说,这个问题相当于找到那些员工,他们没有被第5部门控制的项目,而该员工没有工作

因此,首先查找由第5部门控制的所有项目,然后从该部门中删除该员工从事的任何项目。这正是提供的答案所做的。如果没有留下任何东西,那么就没有由第5部门控制的、该员工不参与的项目。因此,根据等价关系,该员工负责该部门控制的所有项目


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

存在-select查询返回结果。不存在-它不存在。你能使用联接吗?问题不是找到更好的方法来实现这一点,而是要了解存在是如何工作的。谢谢你的解释。我还有一个问题。这一次似乎没有忽略两个SELECT in子查询。为什么不呢?因为我知道MySQL在子查询中忽略SELECT。这是链接:啊,不,我想你误解了。使用EXISTS时,子查询返回的行中的内容并不重要。重要的是是否有任何东西被退回。如果子查询返回记录,那么记录中的内容就无关紧要了,内容本身就会被忽略。存在只关心存在或不存在,而不关心那个东西是什么。。。在子查询本身中,对于减号或sql server之外的查询,这些选择的内容肯定很重要,但一旦减号被处理,如果可以忽略任何内容,则剩下的实际内容。。。只剩下行了还是没有行了,重要的是是否返回了任何内容。我现在明白了。非常感谢。
SELECT *
FROM Employee
WHERE Dno = 5
  AND EXISTS ( SELECT Sex
               FROM employee
               WHERE Sex = 'M'
                 AND Dno = 5 )
SELECT *
FROM Employee
WHERE Dno = 5
  AND NOT EXISTS ( SELECT Sex
                   FROM employee
                   WHERE Sex = 'M'
                     AND Dno = 5 )