본문 바로가기
Skillset/SQL

SQL 집합 연산자 - UNION, UNION ALL, INTERSECT, EXCEPT

by Everly. 2022. 6. 3.

오늘은 SQL의 집합 연산자에 대해 정리해봅니다.

2가지 이상의 SELECT절의 결과를 1개로 통합하는 데 사용하는 연산자로, 

 

  • 합집합: UNION (중복 X), UNION ALL (중복 O)
  • 교집합: INTERSECT (중복 X)
  • 차집합: EXCEPT (중복 X)

이렇게 4가지를 사용합니다. 예제로 알아보겠습니다.

 

✔Table of Contents

     

    1. 합집합 연산자 (UNION, UNION ALL)

    먼저 우리가 사용할 데이터는 [MEMBER_1], [MEMBER_2] 라는 2개의 데이터입니다. 

    이 2가지 데이터는 겹치는 데이터가 있는 서로 다른 데이터입니다. 한번 살펴봅시다.

     

    USE EDU
    SELECT * FROM [MEMBER_1]
    SELECT * FROM [MEMBER_2]

     

    이렇게 두 데이터는 회원번호 '1000006', '1000007' 번이 겹치네요!

    이 두가지를 합쳐 한번에 보여주는 합집합 연산자를 사용합니다.

     

    -- 합집합 row-bind 결합 
    SELECT * FROM [MEMBER_1]
    UNION 
    SELECT * FROM [MEMBER_2]

    먼저 UNION을 사용합니다. 이 연산자는 중복이 없이 결합하기 때문에 중복이었던 100006, 100007번 데이터가 1개만 나옵니다.

     

    SELECT * FROM [MEMBER_1]
    UNION ALL 
    SELECT * FROM [MEMBER_2]

    하지만 UNION ALL은 중복을 그대로 허용하여 결합합니다.

    그래서 100006, 1000007번 데이터가 중복되어 2개씩 나타난 것을 볼 수 있습니다.

     


    2. 교집합 연산자 (INTERSECT)

    교집합을 하면 당연히 공통되는 것만 나오게 되겠죠? 당연히 중복도 제거합니다.

     

    -- 교집합 row-bind 결합 
    -- INTERSECT (중복X)
    SELECT * FROM [MEMBER_1]
    INTERSECT
    SELECT * FROM [MEMBER_2]

    이렇게 1000006, 1000007 번만 뽑힙니다.

     


    3. 차집합 연산자 (EXCEPT)

    마지막으로 차집합 연산자는 처음 쓴 데이터에서 나중에 쓴 데이터와 겹치는 값을 빼서 반환합니다. 당연히 중복도 제거되겠죠?

    그래서 순서에 따라 연산 결과가 달라지는데요!

    먼저 MEMBER_1 기준 차집합을 구해보고, 그 다음엔 MEMBER_2 기준 차집합을 구해봅시다.

     

    -- 차집합 row-bind 결합
    -- EXCEPT (중복X)
    SELECT * FROM [MEMBER_1]
    EXCEPT 
    SELECT * FROM [MEMBER_2]

    먼저 MEMBER_1 기준 차집합입니다. 

    MEMBER_1의 데이터 중에서, 겹치는 값이었던 1000006, 1000007 데이터가 사라졌습니다.

     

    SELECT * FROM [MEMBER_2]
    EXCEPT 
    SELECT * FROM [MEMBER_1]

    다음은 MEMBER_2 기준 차집합입니다.

    MEMBER_2의 데이터 중에서, 겹치는 값이었던 1000006, 1000007 데이터가 사라지고 반환되었습니다.

     


    이렇게 집합 연산자 부분을 마무리합니다. 간단하죠?

    그렇다면 궁금한 점이 생깁니다. [MEMBER_1], [MEMBER_2] 는 데이터의 내용만 다를 뿐 컬럼 형식은 똑같았는데요!

    그럼 완전히 다른 데이터셋에 대해서도 이를 묶어서 보여줄 수 있을까요? 

     

    -> 정답을 얘기하자면, 동일한 컬럼값이 있어야 가능합니다.

    만일 예를들어 컬럼이 완전 다른 [MEMBER_1] 과 [ORDER] 테이블을 UNION ALL 해볼까요?

     

    SELECT * FROM [MEMBER_2]
    UNION ALL
    SELECT * FROM [ORDER]

     

    "UNION, INTERSECT 또는 EXCEPT 연산자를 사용하여 결합된 모든 쿼리의 대상 목록에는 동일한 개수의 식이 있어야 합니다. " 라는 에러가 뜹니다. 

    그래서 컬럼(열)만 일정하게 맞춰준다면, 자유자재로 합집합 / 교집합 / 차집합 연산을 할 수 있습니다.

    반응형

    댓글