SQL에서 UNION, UNION ALL, 그리고 칼럼 수 맞추기 (NULL AS)의 활용

Gi Woon Lee·2025년 4월 11일

SQL

목록 보기
30/33

과거의 내 쿼리 구경하기

https://school.programmers.co.kr/learn/courses/30/lessons/131537

WITH UNION_TABLE AS (
SELECT
    SALES_DATE, PRODUCT_ID, USER_ID, SALES_AMOUNT
FROM 
    ONLINE_SALE
WHERE 
    DATE_FORMAT(SALES_DATE, '%Y-%m') = '2022-03'
UNION
SELECT
    SALES_DATE, PRODUCT_ID, NULL AS USER_ID, SALES_AMOUNT
FROM 
    OFFLINE_SALE
WHERE 
    DATE_FORMAT(SALES_DATE, '%Y-%m') = '2022-03')
    
SELECT 
    DATE_FORMAT(SALES_DATE, '%Y-%m-%d') SALES_DATE,
    PRODUCT_ID, USER_ID, SALES_AMOUNT
FROM 
    UNION_TABLE
ORDER BY 
    SALES_DATE, PRODUCT_ID, USER_ID;
  • 테이블: 온라인과 오프라인 상품 판매 테이블 ONLINE_SALE, OFFLINE_SALE
  • 주문: 온라인과 오프라인에서 3월에 판매된 데이터를 보고싶음
  • 전략: UNION ALL 을 통해 두 테이블을 합친 뒤에 DATE칼럼 필터링
  • 문제: UNION을 사용하려면 칼럼 개수가 동일해야 하는데 다르다!!
  • 해결: 🔥NULL AS 칼럼을 통해 NULL로 채워진 칼럼을 만들어 칼럼 개수를 동일하게 맞춰줌🔥

📘 TIL: SQL에서 UNION, UNION ALL, 그리고 칼럼 수 맞추기 (NULL AS)의 활용

1. UNION vs UNION ALL

UNION

  • 중복된 레코드 제거
  • 두 SELECT의 결과에서 중복된 행이 있으면 하나만 남김
  • 성능이 UNION ALL보다 느림 (중복 제거 작업 수행)
SELECT col1 FROM table1
UNION
SELECT col1 FROM table2;

중복 제거 (distinct) 기능이 포함됨


UNION ALL

  • 중복된 레코드도 모두 유지
  • 단순히 두 SELECT 결과를 그대로 합침
  • 성능이 더 빠름, 불필요한 연산 없음
SELECT col1 FROM table1
UNION ALL
SELECT col1 FROM table2;

중복 허용, 빠름. 대부분의 경우 UNION ALL이 적절


2. 칼럼 수 및 타입 맞추기 (NULL AS 활용)

문제 상황

  • 두 테이블을 UNION하거나 UNION ALL하려면:
    • 칼럼 개수가 같아야 함
    • 칼럼의 데이터 타입이 유사하거나 변환 가능해야 함

해결 방법

  • 부족한 칼럼은 NULL AS 컬럼명 형태로 만들어서 강제로 칼럼 개수를 맞출 수 있음
  • 예시:
-- ONLINE_SALE은 USER_ID 포함
SELECT SALES_DATE, PRODUCT_ID, USER_ID, SALES_AMOUNT FROM ONLINE_SALE

UNION

-- OFFLINE_SALE은 USER_ID 없으므로 NULL로 보정
SELECT SALES_DATE, PRODUCT_ID, NULL AS USER_ID, SALES_AMOUNT FROM OFFLINE_SALE

이렇게 하면 USER_ID가 없는 테이블도 UNION 대상에 포함될 수 있음


3. 날짜 필터링과 정렬 조건

  • DATE_FORMAT(SALES_DATE, '%Y-%m') = '2022-03'각 테이블에서 미리 필터링하면 성능 최적화 가능
  • ORDER BY는 문제 요구 조건에 맞게 다음 우선순위로 설정:
    1. SALES_DATE 오름차순
    2. PRODUCT_ID 오름차순
    3. USER_ID 오름차순 (NULL 먼저 나옴)

✅ 요약 정리

항목설명
UNION중복 제거, 느림
UNION ALL중복 유지, 빠름
칼럼 수 불일치 해결NULL AS 컬럼명으로 맞추기
필터링 위치UNION 이전에 WHERE 절로 필터
정렬 우선순위문제에서 요구하는 기준대로 ORDER BY 사용

0개의 댓글