서브쿼리 연산자

서브쿼리 연산자 (Subquery operators)

이 문서는 Snowflake가 지원하는 서브쿼리 연산자에 대해 설명해요. ALL/ANY, [NOT] EXISTS, [NOT] IN 연산자가 어떻게 동작하는지, 문법과 사용 시 주의사항, 그리고 각각의 예시를 다루어요.

출처: Snowflake SQL Reference

본문

서브쿼리는 다른 쿼리 안에 있는 쿼리예요. 서브쿼리 연산자는 서브쿼리가 생성한 값에 대해 연산을 수행해요.

Snowflake는 다음 서브쿼리 연산자를 지원해요:

  • ALL / ANY
  • [NOT] EXISTS
  • [NOT] IN

ALL / ANY

ALL과 ANY 키워드는 서브쿼리(둘 이상의 행을 반환할 수 있음)가 생성한 값에 비교 연산자를 적용하는 데 사용할 수 있어요.

문법 (Syntax)

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

여기서:

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

사용 시 주의사항 (Usage notes)

  • 표현식은 서브쿼리가 반환하는 각 값마다 연산자로 비교돼요:
    • ALL을 지정하면 서브쿼리의 모든 행이 조건을 만족할 때 결과가 TRUE이고, 그렇지 않으면 FALSE를 반환해요.
    • ANY를 지정하면 서브쿼리의 어떤 행이라도 조건을 만족할 때 결과가 TRUE이고, 그렇지 않으면 FALSE를 반환해요.
  • ANY/ALL 서브쿼리는 현재 WHERE 절에서만 지원돼요.
  • ANY/ALL 서브쿼리는 OR 연산자의 인자로 나타날 수 없어요.
  • 서브쿼리의 SELECT 목록에는 항목이 하나만 들어 있어야 해요.

예시 (Examples)

!= ALL 서브쿼리를 사용해서 직원이 없는 부서를 찾아 봐요:

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

[ NOT ] EXISTS

EXISTS 서브쿼리는 WHERE 또는 HAVING 절에서, 또는 불리언 표현식에 대해 연산하는 어떤 함수에서나 나타날 수 있는 불리언 표현식이에요:

  • EXISTS 표현식은 서브쿼리가 어떤 행이라도 생성하면 TRUE로 평가돼요.
  • NOT EXISTS 표현식은 서브쿼리가 행을 생성하지 않으면 TRUE로 평가돼요.

문법 (Syntax)

[ NOT ] EXISTS ( <query> )

사용 시 주의사항 (Usage notes)

  • 상관(correlated) EXISTS 서브쿼리는 현재 WHERE 절에서만 지원돼요.
  • 상관 EXISTS 서브쿼리는 OR 연산자의 인자로 나타날 수 없어요.
  • 비상관(uncorrelated) EXISTS 서브쿼리는 불리언 표현식이 허용되는 어디에서나 지원돼요.

예시 (Examples)

상관 NOT EXISTS 서브쿼리를 사용해서 직원이 없는 부서를 찾아 봐요:

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

[ NOT ] IN

IN과 NOT IN 연산자는 표현식이 서브쿼리가 생성한 값에 포함되는지 확인해요.

문법 (Syntax)

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

사용 시 주의사항 (Usage notes)

  • IN은 = ANY의 축약형이고, ANY 서브쿼리와 같은 제한을 받아요.
  • NOT IN은 != ALL의 축약형이고, ALL 서브쿼리와 같은 제한을 받아요.
  • [NOT] IN은 서브쿼리를 포함하지 않는 표현식에서도 연산자로 사용할 수 있어요. 자세한 내용은 [NOT] IN을 참고하세요.

예시 (Examples)

!= ALL 서브쿼리 예시와 동등한 NOT IN 서브쿼리를 사용해서 직원이 없는 부서를 찾아 봐요:

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

더 알아보기 (Learn more)