[SQL] UNION과 UNION ALL 정리

#SQL#UNION

1. UNION에 대해서와 UNION을 사용하는 이유

UNION 은 두 개 이상의 SELECT 문 결과 집합을 세로로 결합하여 하나의 결과로 만드는 집합 연산자이다.

주로 UNION은 다음과 같은 이유로 사용한다.

  • 서로 다른 테이블의 데이터를 통합 조회
    • 예를 들어 '온라인 주문' 테이블과 '오프라인 주문' 테이블이 따로 있을 때, 이를 하나의 '전체 주문 내역'으로 보고 싶을 때 사용합니다.
  • 복잡한 조건을 하나로 병합
    • 하나의 쿼리 내에서 OR 조건으로 풀기 너무 복잡하거나 성능이 안 나올 때, 각각의 쿼리를 따로 작성한 뒤 UNION으로 합치기도 합니다.

2. UNION 사용법

기본 사용법은 다음과 같습니다.

SELECT col1, col2
FROM table1

UNION [ALL]

SELECT col1, col2
FROM table2

SELECT문 사이에 UNION 또는 UNION ALL을 넣으면 됩니다.

  • UNION: 중복된 행을 제거합니다.
  • UNION ALL: 중복을 제거하지 않습니다.

3. UNION의 제약사항 및 한계

3.1. 제약 사항

UNION을 사용할 때는 다음의 까다로운 규칙을 지켜야 합니다.

  • 열의 개수 일치

    • 첫 번째 SELECT에서 3개의 열을 뽑았다면, 두 번째에서도 반드시 3개를 뽑아야 합니다.
  • 데이터 타입의 호환성

    • 동일한 위치의 열은 서로 데이터 타입이 비슷해야 합니다. (예: 문자열과 숫자를 합치면 MySQL이 암시적 형변환을 시도하지만, 오류의 원인이 될 수 있습니다.)
  • 컬럼명 결정

    • 최종 결과 세트의 컬럼명은 첫 번째 SELECT 문에서 지정한 이름을 따릅니다.
  • 정렬의 위치

    • ORDER BY는 개별 쿼리에 붙일 수 없으며, 가장 마지막에 한 번만 작성하여 전체 결과를 정렬합니다.

3.2. 단점

  1. 메모리 및 CPU 소모

UNION은 내부적으로 임시 테이블을 생성하고 데이터를 정렬해서 중복을 찾아냅니다. 따라서 데이터 양이 많을수록 부하가 급증합니다.

  1. 인덱스 활용의 한계

개별 쿼리에서는 인덱스를 타더라도, UNION의 결과 집합에 다시 조건을 걸 때는 인덱스를 활용하기 어렵습니다.

  1. 가독성 저하

너무 많은 SELECT절을 UNION으로 묶으면 쿼리가 길어지고 유지보수가 힘들어집니다.

4. 대안

  1. JOIN
  • 상황: 여러 테이블의 데이터를 "행 확장(가로 결합)"해서 조회할 때 사용합니다. 예를 들어 주문 테이블에 회원 정보, 상품 정보를 붙여서 한 번에 보고 싶을 때 적합합니다.
  • 설명: UNION이 결과를 세로로 붙이는 방식이라면, JOIN은 키를 기준으로 컬럼을 늘리는 방식입니다. 데이터 간 관계(외래 키)가 명확할 때 가장 자연스럽고, 인덱스를 잘 활용하면 성능상 유리한 경우가 많습니다.
  1. IN 또는 OR
  • 상황: 같은 테이블에서 조건만 다른 데이터를 함께 조회할 때 사용합니다. 예를 들어 같은 주문 테이블에서 상태가 PAID 또는 SHIPPED인 건만 조회하는 경우입니다.
  • 설명: 단일 SELECT 안에서 조건을 합칠 수 있으므로 쿼리가 짧아지고 관리가 쉬워집니다. 다만 조건이 매우 복잡해지면 가독성이 떨어질 수 있으니, 그때는 UNION ALL로 분리하는 것이 더 명확할 수 있습니다.
  1. CASE WHEN
  • 상황: 행을 합치는 것보다, 결과를 분류/라벨링해서 보여주고 싶을 때 사용합니다. 예를 들어 금액에 따라 주문을 HIGH, MID, LOW로 구분할 때 유용합니다.
  • 설명: 여러 쿼리를 합치는 대신 하나의 결과 집합 안에서 조건별 값을 계산하거나 분기할 수 있습니다. 특히 집계 쿼리에서 조건부 집계(SUM(CASE WHEN ...))를 만들 때 UNION보다 단순하고 빠른 경우가 많습니다.
  1. View 또는 물리 테이블
  • 상황: 동일한 UNION 로직을 여러 서비스/화면에서 반복해서 사용할 때 적합합니다. 또는 조회 성능이 중요해 결과를 미리 준비해 둬야 할 때 사용합니다.
  • 설명: View는 쿼리 재사용성과 일관성을 높여 주고, 물리 테이블(예: 배치 적재 테이블)은 읽기 성능을 크게 개선할 수 있습니다. 다만 데이터 최신성, 갱신 주기, 운영 복잡도(배치 실패 대응)를 함께 설계해야 합니다.

5. 결론

UNION은 여러 결과 집합을 하나로 합쳐야 할 때 매우 유용한 도구입니다.
하지만 중복 제거가 필요한지 여부에 따라 UNIONUNION ALL을 명확히 구분해서 선택해야 합니다.

만약 성능이 중요하다면 기본적으로 UNION ALL을 먼저 고려하고, 정말 중복 제거가 필요할 때만 UNION을 사용하는 것이 안전합니다.
또한 열 개수와 타입 호환성, 정렬 위치 같은 제약을 정확히 지켜야 예측 가능한 쿼리를 만들 수 있습니다.


© 2026 kdkdhoho. Built with Gatsby