[Oracle] 집합연산자 알아보기 Set Operator : UNION [ALL], INTERSECT, MINUS

오라클 집합 연산자에 대해 알아봅시다. 집합 연산자는 UNION ALL(합집합 중복 허용), UNION(합집합), INTERSECT(교집합), 그리고 MINUS(차집합)가 있습니다. 각 집합에 대하여 순서대로 안내해드리겠습니다.

Set Operator 집합 연산자

예시 테이블은 다음과 같습니다.

Oracle Set Operator

{TABLEA} A테이블은 [C1], [C2] 두 개의 칼럼으로 이루어져 있고 로우는 (A, B), (B, C), (C, D)가 있습니다.

Oracle Set

{TABLEB} B테이블은 [C1], [C2] 두 개의 칼럼으로 이루어져 있고 로우는 (B, B), (B, C), (C, C)가 있습니다.

특징은 (B, C) 로우테이블A에도 있고 테이블B에도 있다는 것입니다. 이 부분을 기억해 주시고 진행하겠습니다.

테이블을 구성하고 있는 UNION ALL 은 바로 아래에서 설명드리겠습니다.

WITH TABLEA
     AS (SELECT 'A' C1, 'B' C2 FROM DUAL
         UNION ALL
         SELECT 'B', 'C' FROM DUAL
         UNION ALL
         SELECT 'C', 'D' FROM DUAL),
     TABLEB
     AS (SELECT 'B' C1, 'B' C2 FROM DUAL
         UNION ALL
         SELECT 'B', 'C' FROM DUAL
         UNION ALL
         SELECT 'C', 'C' FROM DUAL)
SELECT C1, C2 FROM TABLEA
--UNION ALL
--UNION
--INTERSECT
--MINUS
--SELECT C1, C2 FROM TABLEB

UNION ALL 합집합 중복 허용

UNION ALL

UNION ALL 은 중복을 허용하는 합집합입니다.

{TABLEA} UNION ALL {TABLEB}는 각 테이블의 모든 로우를 조회합니다.

(B, C) 로우는 테이블 A와 테이블 B에 모두 있으며 조회 결과에서 중복하여 표시가 되는 것을 확인하실 수 있습니다.

WITH TABLEA
          AS (SELECT 'A' C1, 'B' C2 FROM DUAL
              UNION ALL
              SELECT 'B', 'C' FROM DUAL
              UNION ALL
              SELECT 'C', 'D' FROM DUAL),
          TABLEB
          AS (SELECT 'B' C1, 'B' C2 FROM DUAL
              UNION ALL
              SELECT 'B', 'C' FROM DUAL
              UNION ALL
              SELECT 'C', 'C' FROM DUAL)
     SELECT C1, C2 FROM TABLEA
     UNION ALL
     SELECT C1, C2 FROM TABLEB;

C1 C2
-- --
A  B
B  C
C  D
B  B
B  C
C  C

UNION 합집합

UNION

UNION 합집합은 일반적으로 생각할 수 있는 합집합 형태로 중복은 제외를 합니다.

{TABLEA}과 {TABLEB}에 모두 포함되어 있는 로우 (B, C)는 중복을 정리하고 하나만 조회를 합니다.

제외 과정에서 내부 정렬이 이루어집니다.

WITH TABLEA
          AS (SELECT 'A' C1, 'B' C2 FROM DUAL
              UNION ALL
              SELECT 'B', 'C' FROM DUAL
              UNION ALL
              SELECT 'C', 'D' FROM DUAL),
          TABLEB
          AS (SELECT 'B' C1, 'B' C2 FROM DUAL
              UNION ALL
              SELECT 'B', 'C' FROM DUAL
              UNION ALL
              SELECT 'C', 'C' FROM DUAL)
     SELECT C1, C2 FROM TABLEA
     UNION
     SELECT C1, C2 FROM TABLEB;

C1 C2
-- --
A  B
B  B
B  C
C  C
C  D

INTERSECT 교집합

INTERSECT

INTERSECT 교집합은 두 테이블에 모두 있는 로우를 조회합니다.

(B, C) 로우가 교차하므로 해당 레코드를 조회합니다.

WITH TABLEA
          AS (SELECT 'A' C1, 'B' C2 FROM DUAL
              UNION ALL
              SELECT 'B', 'C' FROM DUAL
              UNION ALL
              SELECT 'C', 'D' FROM DUAL),
          TABLEB
          AS (SELECT 'B' C1, 'B' C2 FROM DUAL
              UNION ALL
              SELECT 'B', 'C' FROM DUAL
              UNION ALL
              SELECT 'C', 'C' FROM DUAL)
     SELECT C1, C2 FROM TABLEA
     INTERSECT
     SELECT C1, C2 FROM TABLEB;

C1 C2
-- --
B  C

MINUS 차집합

MINUS

MINUS 차집합은 선행 테이블 {TABLEA}에서 후행 테이블 {TABLEB}의 중복(공통) 로우를 제외하여 조회합니다.

즉, 선행 테이블에만 있고 후행 테이블에는 없는 레코드를 조회합니다.

(B, C) 로우는 {TABLEA}, {TABLEB} 모두에 있기에 제외되어 결과가 나옵니다.

WITH TABLEA
          AS (SELECT 'A' C1, 'B' C2 FROM DUAL
              UNION ALL
              SELECT 'B', 'C' FROM DUAL
              UNION ALL
              SELECT 'C', 'D' FROM DUAL),
          TABLEB
          AS (SELECT 'B' C1, 'B' C2 FROM DUAL
              UNION ALL
              SELECT 'B', 'C' FROM DUAL
              UNION ALL
              SELECT 'C', 'C' FROM DUAL)
     SELECT C1, C2 FROM TABLEA
     MINUS
     SELECT C1, C2 FROM TABLEB;

C1 C2
-- --
A  B
C  D

댓글