- 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 기준 오름차순
- 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'로 시작하는 행
첫 번째 쿼리는 이러한 형식 변환 과정이 없어, 원본 테이블에 저장된 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월의 데이터를 정확하게 추출