解释 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
条件匹配原始数据集子集的子句。
如果 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
条件匹配原始数据集子集的子句。