TIL - 집합연산

이태연·2022년 2월 21일
0
post-thumbnail

집합연산이란?

SQL에서 집합연산이란 두개 이상의 테이블에서 조인을 사용하지 않고 연관된 테이블을 조회하는 연산을 의미합니다.

SQL과 집합

  • 데이터베이스에서는 테이블의 행이 요소에 해당합니다. 행은 여러 개의 열로 구성되는 경우도 있으므로 수치 상으로 복수의 값이 존재합니다.
    하지만 집합의 요소라는 측면에서 보면 하나의 행이 곧 하나의 요소가 됩니다.

  • SELECT 명령을 실행하면 그 결과 몇 개의 행이 반환되는데 이때 반환된 결과 전체를 하나의 집합이라고 볼 수 있습니다.

UNION으로 합집합 구하기

  • UNION은 합집합을 구할 때 사용됩니다.

  • sample71_a 테이블과 sample71_b 테이블의 합집합을 구하려면 두 개의 SELECT 명령을 UNION을 사용해서 구하면 됩니다.
    SELECT * FROM sample71_a UNION SELECT * FROM sample71_b;

    두 개의 SELECT 명령을 하나의 명령으로 합치는 만큼, 세미콜론(;)은 맨 나중에 붙여야 합니다.

  • UNION을 이용하면 여러 개의 SELECT 명령을 하나로 묶을 수 있습니다. 주의할 점은 UNION을 이용할 때 열의 이름은 달라도 열의 개수는 일치해야 합니다. 열 구성이 다른 테이블은 UNION으로 묶을 수 없습니다.

UNION을 사용할 때의 ORDER BY

  • UNION으로 SELECT 명령을 결합해 합집합을 구하는 경우 ORDER BY는 마지막 SELECT 명령에만 지정해야 합니다.
    그렇지 않을 에러가 발생합니다.
    SELECT a FROM a sample71_a ORDER BY a UNION SELECT b FROM b sample71_b;

  • SELECT 명령에서 열 이름이 서로 다를 경우 에러가 발생할 수 있습니다. 예를 들어 SELECT a FROM sample71_a UNION SELECT b FROM sample71_b ORDER BY b; 쿼리에서도 에러가 발생합니다. 왜냐하면 해당 합집합은 열 이름이 b가 아닌 a가 되기 때문입니다.

이런 경우 서로 동일하게 별명을 붙인 후 정렬할 수 있습니다.
SELECT a AS c FROM sample71_a UNION SELECT b AS c FROM sample71_b ORDER BY c;

UNION ALL

두 집합에서 겹치는 부분은 공통 요소가 됩니다. 두 집합을 합집합 하면 집합에서 공통 요소의 중복은 제거된 상태로 결괏값이 나오는 것을 확인할 수 있습니다.

앞에서 예시로 들었던 테이블 sample71_a와 sample71_b 둘다 2가 포함되어 있지만 UNION을 이용하여 합집합을 구할 경우 2가 하나만 나오는 것을 확인할 수 있습니다.

하지만 중복된 값을 제거하지 않고 모두 반환하고 싶을 경우에는 UNION ALL을 적용하여 구할 수 있습니다.

SELECT * FROM sample71_a UNION ALL SELECT * FROM sample71_b;

2가 중복이 되었지만 제거되지 않고 모두 반환이 되는 것을 확인할 수 있습니다.

교집합과 차집합

  • MySQL에서는 교집합과 차집합이 지원되지 않습니다.
  • SQL을 이용해 교집합, 차집합도 구할 수 있습니다. 교집합은 INTERSECT, 차집합은 EXCEPT(Oralce의 경우 MINUS)를 사용합니다.
profile
주니어 백엔드 웹 개발자입니다.

0개의 댓글