子查询运算符

子查询 是另一个查询中的一个查询。子查询运算符对子查询产生的值执行运算。

Snowflake 支持以下子查询运算符:

ALL / ANY

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

语法

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

其中:

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

使用说明

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

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

    • 如果指定 ANY,则如果子查询的任意行满足条件,则结果为 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
语言: 中文