Home 13. 집합 연산자
Post
Cancel

13. 집합 연산자

집합 연산자는 데이터 집합을 연결한다는 점에서 조인과 유사하게 동작한다. 조인은 데이터 집합을 수직으로 연결하고, 집합 연산자는 데이터 집합을 수평으로 연결한다.

13.1 기본 문법

13.1.1 UNION ALL 연산자

UNION ALL 연산자는 데이터 집합을 수평으로 연결한다. 기술 순서대로 데이터 집합이 반환된다.

1
2
3
4
# t1 테이블이 반환된 후, t2 테이블이 반환된다.
SELECT c1 FROM t1
UNION ALL
SELECT c2 FROM t2;

13.1.2 UNION 연산자

중복 값이 제거된 합집합을 생성한다. 중복 값을 제거하기 위해 sort가 발생한다.

1
2
3
SELECT c1 FROM t1
UNION
SELECT c2 FROM t2;

1
2
3
4
# 아래 쿼리는 데이터 집합이 중복되지 않기 때문에 UNION ALL을 사용해도 결과가 동일하다. 불필요한 sort가 발생하지 않도록 UNION ALL을 사용하자
SELECT '1' AS tp, empno, ename FROM emp WHERE job = 'ANALYST'
UNION
SELECT '2' AS tp, empno, ename FROM emp WHERE sal = 3000;

13.1.3 INTERSECT 연산자

중복 값이 제거된 교집합을 생성한다.

1
2
3
SELECT c1 FROM t1
INTERSECT
SELECT c1 FROM t2;

13.1.4 MINUS 연산자

중복 값이 제거된 차집합을 생성한다.

1
2
3
4
# t1 - t2
SELECT c1 FROM t1
MINUS
SELECT c1 FROM t2;

13.2 주의사항

  1. 연결되는 열의 개수가 동일해야 한다.
  2. 연결되는 열의 데이터 타입이 동일해야 한다.
  3. 집합 연산자를 사용한 쿼리는 ORDER BY 절을 쿼리의 마지막에 1번만 기술해야 한다.(UNION ALL 연산자의 경우 인라인 뷰에서 데이터를 정렬한 후 데이터 집합을 연결할 수 있다.)
  4. 집합 연산자는 우선순위가 동일하기 때문에 기술 순서대로 연산이 수행된다. (괄호를 사용하여 연산 순서를 조정할 수 있다.)

13.3 활용 예제

OR 조건 성능 개선 : OR 조건을 사용한 쿼리는 다수의 조건으로 인해 쿼리의 성능이 저하될 수 있다. UNION ALL 연산자로 데이터 집합을 분리함으로써 쿼리의 성능을 개선할 수 있다.

1
2
3
4
5
6
7
SELECT ename, sal, deptno
FROM emp
WHERE((deptno = 10 AND sal >= 2000) OR (deptno = 20 AND sal >= 3000));

SELECT ename, sal, detnp FROM emp WHERE deptno = 10 AND sal >= 2000
UNION ALL
SELECT ename, sal, detnp FROM emp WHERE deptno = 20 AND sal >= 3000;

동적 조건 성능 개선 : UNION ALL 연산자로 동적 조건의 성능을 개선할 수 있다. 328~329p

FULL OUTER JOIN 성능 개선 : FULL OUTER JOIN을 수행하면 조인이 여러 번 수행되어 쿼리의 성능이 저하되었다. 성능 개선을 위해 UNION ALL 연산자로 변경하는 기법을 사용할 수 있다. 그렇다고 모든 FULL OUTER JOIN을 UNION ALL 연산자로 변경할 수 있는 것은 아니다. FULL OUTER JOIN의 조인 차수가 1:1인 경우만 FULL OUTER JOIN을 UNION ALL 연산자로 변경할 수 있다. 330~334p

INTERSECT, MINUS 연산자 성능 개선 : UNION, INTERSECT, MINUS 연산자는 중복 값을 제거하기 위해 데이터 집합을 정렬한다. 대량 데이터에 소트가 발생하면 쿼리 성능이 저하될 수 있다. INTERSECT, MINUS 연산자는 서브 쿼리로의 변경을 통해 소트 발생량을 감소시킬 수 있다.

This post is licensed under CC BY 4.0 by the author.

12. 서브 쿼리

14. 분석함수