세트 연산자

세트 연산자를 사용하면 쿼리를 결합할 수 있습니다.

이 항목의 내용:

일반 구문

[ ( ] <query> [ ) ] { INTERSECT | { MINUS | EXCEPT } | UNION [ ALL ] } [ ( ] <query> [ ) ]
[ ORDER BY ... ]
[ LIMIT ... ]
Copy

일반적인 사용법 노트

  • 각 쿼리는 그 자체가 쿼리 연산자를 포함함으로써 쿼리 식을 몇 개라도 세트 연산자와 결합할 수 있습니다.

  • ORDER BYLIMIT / FETCH 절은 세트 연산자의 결과에 적용됩니다.

  • 이들 연산자를 사용할 때 다음 사항이 적용됩니다.

    • 각 쿼리가 같은 수의 열을 선택하는지 확인하십시오.

    • 각 열의 데이터 타입이 서로 다른 원본의 행 전체에서 일치하는지 확인하십시오. 아래 섹션의 한 예에서 데이터 타입이 일치하지 않을 때 발생할 수 있는 문제점과 해결책을 보여줍니다.

    • 일반적으로, 열의 데이터 타입뿐 아니라 “의미”도 일치해야 합니다. 다음은 원하는 결과를 생성하지 않습니다.

      SELECT LastName, FirstName FROM employees
      UNION ALL
      SELECT FirstName, LastName FROM contractors;
      
      Copy

      예컨대, 별표를 사용해 테이블의 모든 열을 지정할 때 오류가 발생할 위험이 증가합니다.

      SELECT * FROM table1
      UNION ALL
      SELECT * FROM table2;
      
      Copy

      테이블의 열 개수가 같지만 열의 순서가 같지 않으면 쿼리 결과가 올바르지 않을 수 있습니다.

    • 출력 열의 이름은 첫 번째 쿼리의 열 이름을 기반으로 합니다. 예를 들어, 다음 쿼리는

      SELECT LastName, FirstName FROM employees
      UNION ALL
      SELECT FirstName, LastName FROM contractors;
      
      Copy

      마치 다음 쿼리인 것처럼 동작합니다.

      SELECT LastName, FirstName FROM employees
      UNION ALL
      SELECT FirstName AS LastName, LastName AS FirstName FROM contractors;
      
      Copy
  • 세트 연산자의 우선 순위는 ANSI 및 ISO SQL 표준과 일치합니다.

    • UNION [ALL]MINUS (EXCEPT) 연산자는 우선 순위가 같습니다.

    • INTERSECT 연산자는 UNION [ALL]MINUS (EXCEPT)보다 우선 순위가 높습니다.

    우선 순위가 같은 연산자는 왼쪽에서 오른쪽으로 처리됩니다.

    괄호를 사용하여 식을 다른 순서로 평가하도록 적용할 수 있습니다.

    모든 데이터베이스 벤더가 set 연산자의 우선 순위에 대해 ANSI/ISO 표준을 따르는 것은 아닙니다. 특히 다른 벤더의 코드를 Snowflake로 포팅하거나 Snowflake뿐 아니라 다른 데이터베이스에서도 실행할 수 있는 코드를 작성하는 경우 괄호를 사용하여 평가 순서를 지정하는 것이 좋습니다.

INTERSECT

한 쿼리의 결과 세트에서 중복 제거와 함께 다른 쿼리의 결과 세트에도 나타나는 행을 반환합니다.

구문

SELECT ...
INTERSECT
SELECT ...
Copy

MINUS , EXCEPT

한 쿼리의 결과 세트에서 중복 제거와 함께 다른 쿼리의 결과 세트에 나타나는 행을 제거합니다.

MINUS 및 EXCEPT 키워드는 같은 의미를 가지고 있고 서로 바꾸어 사용할 수 있습니다.

구문

SELECT ...
MINUS
SELECT ...

SELECT ...
EXCEPT
SELECT ...
Copy

UNION [ ALL ]

두 쿼리의 결과 세트를 결합합니다.

  • UNION 은 중복 제거와 함께 결합합니다.

  • UNIONALL 은 중복 제거 없이 결합합니다.

기본값은 UNION(즉, 중복 제거)입니다.

구문

SELECT ...
UNION [ ALL ]
SELECT ...
Copy

이 예에서는 UNION 연산자의 기본 사용법을 보여줍니다. 또한, 데이터 타입이 일치하지 않을 때 발생할 수 있는 문제점을 보여준 다음 해결책을 제시합니다.

먼저 테이블 만들기와 데이터 삽입부터 시작합니다.

CREATE TABLE t1 (v VARCHAR);
CREATE TABLE t2 (i INTEGER);
INSERT INTO t1 (v) VALUES ('Adams, Douglas');
INSERT INTO t2 (i) VALUES (42);
Copy

다른 데이터 타입으로 UNION 연산을 실행합니다.

SELECT v FROM t1    -- VARCHAR
UNION
SELECT i FROM t2    -- INTEGER
;
Copy

출력:

100038 (22018): Numeric value 'Adams, Douglas' is not recognized
Copy

이제 명시적 캐스팅을 사용해 입력값을 호환 가능한 형식으로 변환합니다.

SELECT v::VARCHAR FROM t1
UNION
SELECT i::VARCHAR FROM t2;
Copy

출력:

+----------------+
| V::VARCHAR     |
|----------------|
| Adams, Douglas |
| 42             |
+----------------+
Copy