Subquery operators

A subquery is a query within another query. Subquery operators perform operations on the values produced by subqueries.

Snowflake supports the following subquery operators:

ALL / ANY

The ALL and ANY keywords can be used to apply a comparison operator to the values produced by a subquery (which can return more than one row).

Syntax

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

Where:

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

Usage notes

  • The expression is compared with the operator for each value that the subquery returns:

    • If ALL is specified, then the result is TRUE if every row of the subquery satisfies the condition; otherwise, it returns FALSE.

    • If ANY is specified, then the result is TRUE if any row of the subquery satisfies the condition; otherwise, it returns FALSE.

  • ANY/ALL subqueries are currently supported only in a WHERE clause.

  • ANY/ALL subqueries can’t appear as an argument to an OR operator.

  • The subquery must contain only one item in its SELECT list.

Examples

Use a != ALL subquery to find the departments that have no employees:

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

[ NOT ] EXISTS

An EXISTS subquery is a Boolean expression that can appear in a WHERE or HAVING clause, or in any function that operates on a Boolean expression:

  • An EXISTS expression evaluates to TRUE if any rows are produced by the subquery.

  • A NOT EXISTS expression evaluates to TRUE if no rows are produced by the subquery.

Syntax

[ NOT ] EXISTS ( <query> )
Copy

Usage notes

  • Correlated EXISTS subqueries are currently supported only in a WHERE clause.

  • Correlated EXISTS subqueries cannot appear as an argument to an OR operator.

  • Uncorrelated EXISTS subqueries are supported anywhere that a Boolean expression is allowed.

Examples

Use a correlated NOT EXISTS subquery to find the departments that have no employees:

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

[ NOT ] IN

The IN and NOT IN operators check whether an expression is included included in the values produced by a subquery.

Syntax

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

Usage notes

  • IN is shorthand for = ANY, and is subject to the same restrictions as ANY subqueries.

  • NOT IN is shorthand for != ALL, and is subject to the same restrictions as ALL subqueries.

  • [NOT] IN can also be used as an operator in expressions that don’t involve a subquery. For details, see [ NOT ] IN.

Examples

Use a NOT IN subquery that is equivalent to the != ALL subquery example (earlier in this topic) to find the departments that have no employees:

SELECT department_id
  FROM departments d
  WHERE d.department_id NOT IN (
    SELECT e.department_id
      FROM employees e);
Copy