서브쿼리 연산자
서브쿼리 연산자 (Subquery operators)
이 문서는 Snowflake가 지원하는 서브쿼리 연산자에 대해 설명해요. ALL/ANY, [NOT] EXISTS, [NOT] IN 연산자가 어떻게 동작하는지, 문법과 사용 시 주의사항, 그리고 각각의 예시를 다루어요.
본문
서브쿼리는 다른 쿼리 안에 있는 쿼리예요. 서브쿼리 연산자는 서브쿼리가 생성한 값에 대해 연산을 수행해요.
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);