EXISTS / NOT EXISTS如何工作?

时间:2018-05-26 19:46:39

标签: sql database oracle

我理解如何使用EXISTS编写查询。例如,以下两个查询是相同的:

SELECT last_name
FROM employees
WHERE employee_id in (SELECT manager_id
                      FROM employees);

SELECT last_name
FROM employees e
WHERE EXISTS (SELECT *
              FROM employees em
              WHERE em.manager_id = e.employee_id);

我不明白的是EXISTS条款背后的逻辑。我不明白此查询如何与使用IN的其他查询等效。

请解释EXISTS子句背后的逻辑。

1 个答案:

答案 0 :(得分:3)

您可以将EXISTSIN翻译成英文。

经理名单:

(SELECT manager_id FROM employees) 

员工列表,其id位于经理列表中:

SELECT * 
  FROM employees 
 WHERE employee_id IN (SELECT manager_id FROM employees)

具有经理或“经理存在”的员工列表,或“表雇员中存在的记录具有适合雇员列manager_id的记录”目前正在关注:

SELECT *
  FROM employees e
 WHERE EXISTS (
       SELECT *
         FROM employees em
        WHERE e.employee_id = em.manager_id
       );

逻辑上,您的查询会遍历所有员工,如果同一个表中有匹配的经理,则会检查每个员工。

编辑: 顺便说一下,您会发现许多建议只能使用EXISTSIN,而其中一个会比另一个更快。许多年前就是这种情况,但现在两个查询都以相同的速度运行。 Oracle甚至可能将一种语法翻译成另一种语法。

同样,有很多传闻要使用... IN (SELECT 1 ...代替... IN (SELECT * ...,这也是错误的。

但是,外部查询应该只使用您需要的列,特别是如果您只需要employee_id或索引中包含的其他列。