SQL union 문제

현권·2025년 10월 30일

데이터

목록 보기
7/13
  1. SELECT SALES_DATE,
    PRODUCT_ID,
    USER_ID,
    SALES_AMOUNT
    FROM
    ONLINE_SALE
    WHERE
    SALES_DATE >= '2022-03-01' AND SALES_DATE < '2022-04-01'
    UNION ALL
    SELECT
    SALES_DATE,
    PRODUCT_ID,
    NULL AS USER_ID, # OFFLINE_SALE 테이블의 USER_ID는 NULL로 표시
    SALES_AMOUNT
    FROM
    OFFLINE_SALE
    WHERE
    SALES_DATE >= '2022-03-01' AND SALES_DATE < '2022-04-01'
    ORDER BY
    SALES_DATE ASC, -- 1차 정렬: 판매일 기준 오름차순
    PRODUCT_ID ASC, -- 2차 정렬: 상품 ID 기준 오름차순
    USER_ID ASC; -- 3차 정렬: 유저 ID 기준 오름차순
  1. SELECT DATE_FORMAT(SALES_DATE,'%Y-%m-%d') SALES_DATE, PRODUCT_ID, USER_ID, SALES_AMOUNT
    FROM( SELECT SALES_DATE, PRODUCT_ID, USER_ID, SALES_AMOUNT
    FROM ONLINE_SALE
    UNION ALL
    SELECT SALES_DATE, PRODUCT_ID, NULL USER_ID, SALES_AMOUNT
    FROM OFFLINE_SALE
    ) a
    WHERE SUBSTR(SALES_DATE,1,7) = '2022-03'
    ORDER BY SALES_DATE, PRODUCT_ID, USER_ID

두 SQL 쿼리는 온라인 판매 데이터와 오프라인 판매 데이터를 통합하여 2022년 3월의 전체 판매 내역을 조회 것, 동일한 결과를 반환하지만, 데이터를 필터링하고 날짜 형식을 처리하는 방식에 약간의 차이가 있다.

두 쿼리의 차이점 설명

차이점 분석
첫 번째 쿼리 (범위 필터링)
WHERE SALES_DATE >= '2022-03-01' AND
SALES_DATE < '2022-04-01'
WHERE SUBSTR(SALES_DATE,1,7) = '2022-03'
날짜 형식 처리원본 테이블의 SALES_DATE 유지

두 번째 쿼리 (서브쿼리, 문자열 필터링)
DATE_FORMAT(SALES_DATE,'%Y-%m-%d')를 사용
날짜 형식을 'YYYY-MM-DD'로 명시적으로 변환쿼리 구조
UNION ALL을 사용하여 두 테이블을 합치고,
SELECT마다 WHERE 절을 사용하여 필터링UNION ALL로 두 테이블을 합친 후,
외부 쿼리의 WHERE 절에서 통합된 데이터 전체를 필터링 (서브쿼리)가독성/유지보수
SELECT 문에 필터 조건이 있어 중복이 발생, 명시적인 날짜 범위 설정으로 직관적
서브쿼리로 통합 후 한 번에 필터링하므로 조건 관리의 중복이 줄어듦.

날짜 필터링 방식의 차이
첫 번째 쿼리: 명확한 날짜 범위 지정
(권장)SQLWHERE SALES_DATE >= '2022-03-01' AND SALES_DATE <'2022-04-01'

장점: SALES_DATE 컬럼에 인덱스(Index)가 걸려있을 경우, 데이터베이스가 인덱스를 효율적으로 사용하여 매우 빠르게 데이터를 검색할 수 있다. (성능상 우위)
원리: 2022.3.1 00.00.00부터 2022.4.1 00.00.00 데이터 추출

두 번째 쿼리: 문자열 함수 SQLWHERE SUBSTR(SALES_DATE,1,7)='2022-03'
단점: SUBSTR 함수는 SALES_DATE 컬럼의 모든 값에 대해 첫 7글자를 잘라내는 연산을 수행, 이로 인해 인덱스를 사용하기 어려워져 대량의 데이터에서는 첫 번째 쿼리보다 성능이 떨어질 수 있다.원리: 날짜를 문자열로 간주하고 '2022-03'로 시작하는 행

  1. 날짜 형식 처리의 차이두 번째 쿼리는 최종 결과셋을 출력하기 전에 DATE_FORMAT(SALES_DATE,'%Y-%m-%d') 함수를 사용
    날짜 형식을 'YYYY-MM-DD'로 통일

첫 번째 쿼리는 이러한 형식 변환 과정이 없어, 원본 테이블에 저장된 SALES_DATE의 원래 형식(예: 날짜와 시간이 모두 포함된 DATETIME 형식) 그대로 출력

서브쿼리(인라인 뷰)를 사용하여 데이터를 통합하고 필터링
내부 (서브쿼리 a): ONLINE_SALE과 OFFLINE_SALE 데이터를 UNION ALL로 합칩
외부 통합된 결과 a에서 WHERE 절로 필터링,
DATE_FORMAT으로 날짜를 변환한 후 정렬
이는 대규모의 복잡한 쿼리에서 필터링 조건을 중앙 집중화하여 관리할 때 유용

권장 성능과 정확성 측면에서 첫 번째 쿼리 방식(명시적 날짜 범위 필터링)을 권장

WHERE SALES_DATE >= '2022-03-01' AND SALES_DATE < '2022-04-01'
이 방식은 데이터베이스 인덱스를 활용하기에 가장 효율적, 2022년 3월의 데이터를 정확하게 추출

profile
심심해요

0개의 댓글