> 집합 연산자 (SET OPERATOR)
- 기존의 조인에서는 FROM절에 검색하고자 하는 테이블을 나열하고, WHERE절에 조인 조건을 기술하여 원하는 데이터를 조회할 수 있었다. 하지만 집합 연산자는 여러 개의 질의의 결과를 연결하여 하나로 결합하는 방식을 사용한다. 즉, 집합 연산자는 2개 이상의 질의 결과를 하나의 결과로 만들어 준다.
- 일반적으로 집합 연산자를 사용하는 상황은 서로 다른 테이블에서 유사한 형태의 결과를 반환하는 것을 한의 결과로 합치고자 할 때와 동일 테이블에서 서로 다른 질의를 수행하여 결과를 합치고자 할 때 사용할 수 있다. 이외에도 튜닝 관점에서 실행계획을 분리하고자 하는 목적으로 사용할 수 있다.
- 집합 연산자를 사용하기 위해서는 다음 제약 조건을 만족해야 한다. SELECT 절의 칼럼 수가 동일하고 SELECT 절의 동일 위치에 존재하는 칼럼의 데이터 타입이 상호 호환 가능해야 한다.
> 집합 연산자의 종류
집합 연산자 | 연산자의 의미 |
UNION | 여러 개의 SQL 문의 결과에 대한 합집합으로 결과에서 모든 중복된 행은 하나의 행으로 만든다. |
UNION ALL | 여러 개의 SQL 문의 결과에 대한 합집합으로 중복된 행도 그대로 결과로 표시된다. 즉, 단순히 결과만 합쳐놓은 것이다. |
INTERSECT | 여러 개의 SQL 문의 결과에 대한 교집합이다. 중복된 행은 하나의 행으로 만든다. |
EXCEPT(MINUS) | 앞의 SQL 문의 결과에서 뒤에 SQL문의 결과에 대한 차집합이다. 중복된 행은 하나의 행으로 만든다. |
> 집합 연산자 사용
- 집합 연산자는 사용상의 제약 조건을 만족한다면 어떤 형태의 SELECT 문이라도 이용할 수 있다. 집합 연산자는 2개 이상의 SELECT 문을 연결하는 것이다.
> UNION
- 합집합이라는 것은 WHERE 절에 IN 또는 OR 연산자로도 변환이 가능하다. 다만, IN 또는 OR 연산자를 사용할 경우에는 결과의 표시 순서가 달라질 수 있다.
- 집합이라는 관점에서는 결과가 표시되는 순서가 틀렸다고 두 집합이 서로 다르다고 말할 수 없다. 만약 결과의 동일한 표시 순서를 원한다면 ORDER BY절을 사용해서 명시적으로 정렬 순서를 정의하는 것이 바람직하다.
> UNION ALL
- 데이터 중복을 검증하기 위한 비용이 발생하는 UNION 연산자가 아니라 더 효율적인 UNION ALL 연산자를 권고한다.
- 각각의 질의 결과를 단순히 결합시켜 줄 뿐 중복된 결과를 제외시키지 않는다.
- UNION ALL 사용시 중복되는 데이터가 배제해야 될 대상이 아니라 나름대로 의미를 가지는 경우도 많다.
- 이질적인 성격의 데이터를 한 화면에 보고 싶은 경우에도 UNION ALL을 사용할 수 있다.
- 데이터 HEADING 부분은 첫번째 SQL 문에서 사용된 HEADING이 적용된다.
> INTERSECT
- INTERSECT 연산자는 IN 서브쿼리 또는 EXISTS 서브 쿼리를 이용한 SQL문으로 변경 가능하다.
> EXCEPT(MINUS)
- MINUS 연산자를 사용하지 않고 논리 연산자를 이용하여 동일한 결과의 SQL 문을 작성할 수 있다. <>
- MINUS 연산자는 NOT EXISTS 또는 NOT IN 서브쿼리를 이용한 SQL문으로도 변경 가능하다.
출처 : 한국데이터산업진흥원 게시자료