오라클에서 여러 개의 SELECT 문 결과를 합치기 위해서는 UNION, UNION ALL을 사용하면 된다. UNION을 사용할 경우 합쳐진 결과에서 중복을 제거한 결과를 반환하고, UNION ALL을 사용하면 중복을 제거하지 않고 합쳐진 결과를 그대로를 반환한다.
UNION : 각 쿼리의 결과 합을 반환하는 합집합 (중복제거) UNION ALL : 각 쿼리의 모든 결과를 포함한 합집합 (중복제거 안함) |
기본 사용법
UNION 사용법 (중복 제거)
SELECT job
, deptno
FROM emp
WHERE sal >= 3000
UNION
SELECT job
, deptno
FROM emp
WHERE deptno = 10
PRESEIDENT, ANALYST의 중복된 데이터는 제거되고, 중복되지 않은 데이터만 1건씩 결과가 반환된다.
UNION은 쿼리를 결과를 합치고 중복을 제거하는 작업이 추가로 적용되므로 쿼리의 속도 및 부하가 발생한다. 중복을 제거할 필요가 없으면 UNION ALL을 사용하는 것이 합리적이다.
UNION ALL 사용법 (중복 허용)
SELECT job
, deptno
FROM emp
WHERE sal >= 3000
UNION ALL
SELECT job
, deptno
FROM emp
WHERE deptno = 10
UNION ALL로 합쳐진 쿼리는 각 쿼리에서 조회된 결과를 그대로 합쳐서 반환한다.
사용 시 주의사항
SELECT 'S' AS sal_type
, a.job AS job
, SUM(a.sal) AS total_sal
FROM emp a
GROUP BY a.job
UNION ALL
SELECT 'C' AS sal_type
, a.job AS job
, SUM(a.comm) AS total_comm
FROM emp a
GROUP BY a.job
ORDER BY job, sal_type desc
① 각 쿼리의 SELECT 절 컬럼의 개수와 데이터 타입이 일치해야 한다.
② 첫 번재 쿼리의 컬럼 별칭으로 결과가 반환되므로 두번째 쿼리부터는 별칭을 생략할 수 있다. total_comm의 별칭은 적용이 안된것을 확인할 수 있다.
③ ORDER BY는 마지막 한번만 사용할 수 있으며, 합쳐진 모든 결과를 정렬한다. 컬럼(a.job(X))은 사용할 수 없으며 별칭 및 컬럼 순번으로 정렬이 가능하다.
활용 예제
SELECT DISTINCT
a.deptno
, b.dname
FROM emp a
, dept b
WHERE a.deptno = b.deptno
UNION ALL
SELECT a.deptno
, a.dname
FROM dept a
WHERE NOT EXISTS (SELECT 1
FROM emp aa
WHERE aa.deptno = a.deptno)
서로 다른 테이블을 사용한 쿼리의 결과가 합쳐서 조회되는 것을 확인할 수 있다. SELECT 절의 컬럼의 개수와 각 컬럼의 데이터 타입만 일치하면 된다.
SELECT job
, SUM(sal) AS total_sal
FROM emp
GROUP BY job
UNION ALL
SELECT '합계'
, SUM(sal)
FROM emp
합계를 따로 연산하여 조회 결과에 합치는 용도로 사용할 수 있다.
SELECT *
FROM (
SELECT ename
, sal
FROM emp
WHERE deptno = 10
UNION ALL
SELECT ename
, sal
FROM emp
WHERE deptno = 20
UNION ALL
SELECT ename
, sal
FROM emp
WHERE deptno = 30
ORDER BY 2 desc, 1
)
WHERE rownum < 4
위의 쿼리는 연봉 상위 3명을 조회하는 쿼리이다.
UNION ALL을 사용하여 2개 이상부터 무제한(???)으로 쿼리 문을 합칠 수 있다.
ORDER BY를 사용할 때는 별칭 및 컬럼 순번을 사용해야 하는 것을 기억하자.