解释 EXISTS 关键字

Interpreting EXISTS Keyword

如果 EXISTS 关键字仅评估为 True 或 False,为什么下面查询 returns 所有具有匹配 ID 的指定列而不是所有指定列?

SELECT first_name,
       last_name
FROM employees
WHERE EXISTS (
    SELECT id
    FROM retirees
    WHERE id = employees.id);

因为如果是这种情况,那么查询不应评估为:

SELECT first_name,
       last_name
FROM employees
WHERE EXISTS (
    TRUE);

第一个代码将 select 向您提供从具有 ID 的员工到 table 退休人员的所有行。过滤器会这样。

如果您想查看哪些记录不在退休人员的 table 中,您应该添加 not

像那样:

SELECT first_name,
       last_name
FROM employees
WHERE NOT EXISTS (
    SELECT id
    FROM retirees
    WHERE id = employees.id);

您使用 exists 的方式是 corelated subquery。 exists 的运行并没有结束,而是回溯到每次运行时所有的 employees id 都与 retires table 相匹配。因此,您将获得 o/p 作为与退休匹配的所有员工的 ID。

EXISTS 并不像第二个示例中那样简单 returning TRUE 。它将 returned employees 限制为 ID 匹配 retirees 条目的那些。换句话说,它是 returning all employees,其中 retirees 中的匹配条目存在 。这与 WHERE TRUE.

不同

虽然 EXISTS 具有布尔属性,但此示例中对 TRUE 或 FALSE 的评估决定了 employees 的条目是否应包含在结果中。 WHERE TRUE 表单将使员工的所有行 table 变为 return,这肯定不是 EXISTS 正在做的事情,正如您可能从查询结果中看到的那样。

您可以将 EXISTS 视为将根据 EXISTS 条件匹配原始数据集子集的子句。