세트 연산자¶
세트 연산자를 사용하면 쿼리를 결합할 수 있습니다.
이 항목의 내용:
일반 구문¶
[ ( ] <query> [ ) ] { INTERSECT | { MINUS | EXCEPT } | UNION [ ALL ] } [ ( ] <query> [ ) ]
[ ORDER BY ... ]
[ LIMIT ... ]
일반적인 사용법 노트¶
각 쿼리는 그 자체가 쿼리 연산자를 포함함으로써 쿼리 식을 몇 개라도 세트 연산자와 결합할 수 있습니다.
ORDER BY 및 LIMIT / FETCH 절은 세트 연산자의 결과에 적용됩니다.
이들 연산자를 사용할 때 다음 사항이 적용됩니다.
각 쿼리가 같은 수의 열을 선택하는지 확인하십시오.
각 열의 데이터 타입이 서로 다른 원본의 행 전체에서 일치하는지 확인하십시오. 아래 예 섹션의 한 예에서 데이터 타입이 일치하지 않을 때 발생할 수 있는 문제점과 해결책을 보여줍니다.
일반적으로, 열의 데이터 타입뿐 아니라 “의미”도 일치해야 합니다. 다음은 원하는 결과를 생성하지 않습니다.
SELECT LastName, FirstName FROM employees UNION ALL SELECT FirstName, LastName FROM contractors;
예컨대, 별표를 사용해 테이블의 모든 열을 지정할 때 오류가 발생할 위험이 증가합니다.
SELECT * FROM table1 UNION ALL SELECT * FROM table2;
테이블의 열 개수가 같지만 열의 순서가 같지 않으면 쿼리 결과가 올바르지 않을 수 있습니다.
출력 열의 이름은 첫 번째 쿼리의 열 이름을 기반으로 합니다. 예를 들어, 다음 쿼리는
SELECT LastName, FirstName FROM employees UNION ALL SELECT FirstName, LastName FROM contractors;
마치 다음 쿼리인 것처럼 동작합니다.
SELECT LastName, FirstName FROM employees UNION ALL SELECT FirstName AS LastName, LastName AS FirstName FROM contractors;
세트 연산자의 우선 순위는 ANSI 및 ISO SQL 표준과 일치합니다.
UNION [ALL]
및MINUS
(EXCEPT
) 연산자는 우선 순위가 같습니다.INTERSECT
연산자는UNION [ALL]
및MINUS
(EXCEPT
)보다 우선 순위가 높습니다.
우선 순위가 같은 연산자는 왼쪽에서 오른쪽으로 처리됩니다.
괄호를 사용하여 식을 다른 순서로 평가하도록 적용할 수 있습니다.
모든 데이터베이스 벤더가 set 연산자의 우선 순위에 대해 ANSI/ISO 표준을 따르는 것은 아닙니다. 특히 다른 벤더의 코드를 Snowflake로 포팅하거나 Snowflake뿐 아니라 다른 데이터베이스에서도 실행할 수 있는 코드를 작성하는 경우 괄호를 사용하여 평가 순서를 지정하는 것이 좋습니다.
INTERSECT¶
한 쿼리의 결과 세트에서 중복 제거와 함께 다른 쿼리의 결과 세트에도 나타나는 행을 반환합니다.
구문¶
SELECT ...
INTERSECT
SELECT ...
MINUS , EXCEPT¶
한 쿼리의 결과 세트에서 중복 제거와 함께 다른 쿼리의 결과 세트에 나타나는 행을 제거합니다.
MINUS 및 EXCEPT 키워드는 같은 의미를 가지고 있고 서로 바꾸어 사용할 수 있습니다.
구문¶
SELECT ...
MINUS
SELECT ...
SELECT ...
EXCEPT
SELECT ...
UNION [ ALL ]¶
두 쿼리의 결과 세트를 결합합니다.
UNION 은 중복 제거와 함께 결합합니다.
UNIONALL 은 중복 제거 없이 결합합니다.
기본값은 UNION(즉, 중복 제거)입니다.
구문¶
SELECT ...
UNION [ ALL ]
SELECT ...
예¶
이 예에서는 UNION 연산자의 기본 사용법을 보여줍니다. 또한, 데이터 타입이 일치하지 않을 때 발생할 수 있는 문제점을 보여준 다음 해결책을 제시합니다.
먼저 테이블 만들기와 데이터 삽입부터 시작합니다.
CREATE TABLE t1 (v VARCHAR); CREATE TABLE t2 (i INTEGER); INSERT INTO t1 (v) VALUES ('Adams, Douglas'); INSERT INTO t2 (i) VALUES (42);
다른 데이터 타입으로 UNION 연산을 실행합니다.
SELECT v FROM t1 -- VARCHAR UNION SELECT i FROM t2 -- INTEGER ;출력:
100038 (22018): Numeric value 'Adams, Douglas' is not recognized
이제 명시적 캐스팅을 사용해 입력값을 호환 가능한 형식으로 변환합니다.
SELECT v::VARCHAR FROM t1 UNION SELECT i::VARCHAR FROM t2;출력:
+----------------+ | V::VARCHAR | |----------------| | Adams, Douglas | | 42 | +----------------+