子查询运算符

本主题提供有关 Snowflake 中支持的子查询运算符的参考信息。子查询是另一个查询中的一个查询。

本主题内容:

ALL/ANY

ALL 和 ANY 关键字可用于将比较运算符应用于子查询生成的值(可以返回多行)。

语法

<expr> comparisonOperator { ALL | ANY} ( <query> )
Copy

其中:

comparisonOperator ::=
  { = | != | > | >= | < | <= }
Copy

使用说明

  • 该表达式通过运算符与子查询返回的每个值进行比较:

    • 如果指定 ANY,则如果子查询的任意行满足条件,则结果为 TRUE,否则返回 FALSE。

    • 如果指定 ALL,则如果子查询的每一行都满足条件,则结果为 TRUE,否则返回 FALSE。

  • ANY/ALL 子查询目前仅在 WHERE 子句中受支持。

  • ANY/ALL 子查询不能作为 OR 运算符的实参。

  • 子查询的 SELECT 列表中必须只包含一项。

示例

使用 != ALL 子查询查找没有员工的部门:

SELECT department_id
FROM departments d
WHERE d.department_id != ALL (SELECT e.department_id
                              FROM employees e);
Copy

[ NOT ] EXISTS

EXISTS 子查询是一个布尔表达式,可以出现在 WHEREHAVING 子句中,也可以出现在对布尔表达式进行操作的任何函数中:

  • 如果子查询生成了任何行,则 EXISTS 表达式的计算结果是 TRUE。

  • 如果子查询未生成任何行,则 NOT EXISTS 表达式的计算结果为 TRUE。

语法

[ NOT ] EXISTS ( <query> )
Copy

使用说明

  • 当前仅在 WHERE 子句中支持相关 EXISTS 子查询。

  • 相关 EXISTS 子查询不能作为 OR 运算符的实参。

  • 任何允许布尔表达式的地方都支持非相关 EXISTS 子查询。

示例

使用相关 NOT EXISTS 子查询查找没有员工的部门:

SELECT department_id
FROM departments d
WHERE NOT EXISTS (SELECT 1
                  FROM employees e
                  WHERE e.department_id = d.department_id);
Copy

[ NOT ] IN

IN 和 NOT IN 运算符检查表达式是否包含在子查询返回的值中。

语法

<expr> [ NOT ] IN ( <query> )
Copy

使用说明

  • IN 是 = ANY 的简写,并且受到与 ANY 子查询相同的限制。

  • NOT IN 是 != ALL 的简写,并且受到与 ALL 子查询相同的限制。

  • [NOT] IN 还可以在不涉及子查询的表达式中用作运算符。有关详细信息,请参阅 [ NOT ] IN

示例

使用与 != ALL 子查询示例等效的子查询 NOT IN (本主题前面提到过):

SELECT department_id
FROM departments d
WHERE d.department_id NOT IN (SELECT e.department_id
                              FROM employees e);
Copy
语言: 中文