[Oracle] 오라클 UNION, UNION ALL 사용법 (쿼리 결과 합치기)

오라클에서 여러 개의 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를 사용할 때는 별칭 및 컬 순번을 사용해야 하는 것을 기억하자.

 

예제쿼리(테이블뷰포함).txt
0.00MB

 

 

[오라클] INTERSECT 사용법 (교집합)

오라클에서 서로 다른 쿼리문에서 중복 값이 제거된 교집합 데이터를 조회하기 위해서는 INTERSECT 연산자를 사용하면 된다. 자주 사용하는 UNION ALL과 사용법은 비슷하지만 UNION ALL은 합집합을 반

gent.tistory.com

 

[오라클] MINUS 사용법 (차집합)

오라클에서 MINUS 연산자를 사용하면 서로 다른 쿼리문에서 차집합의 데이터를 구할 수 있다. MINUS 연산자는 다른 데이터베이스의 EXCEPT 연산자와 비슷한 기능을 하며, 중복 값이 제거된 차집합 데

gent.tistory.com

 

댓글

Designed by JB FACTORY