프로모션 기간 매칭하기: BETWEEN과 LEFT JOIN의 실전 활용
왜 이 개념이 중요한가?
실무에서는 단순히 ID로 데이터를 연결하는 것만으로는 부족합니다.
"이 주문이 발생한 시점에 어떤 프로모션이 진행 중이었나?" "이 직원이 재직 중일 때 참여한 프로젝트는?" "계약 기간 내에 발생한 거래 내역은?"
이런 질문에 답하려면 기간 기반 데이터 매칭이 필요합니다.
BETWEEN 연산자의 핵심
BETWEEN은 특정 값이 범위 내에 있는지 확인하는 연산자입니다.
-- 기본 문법 WHERE value BETWEEN start_value AND end_value -- 이것과 동일합니다 WHERE value >= start_value AND value <= end_value
핵심 포인트:
- 시작값과 끝값을 모두 포함합니다 (inclusive)
- 작은 값이 먼저, 큰 값이 나중에 와야 합니다
- 날짜에 사용할 때는 시간까지 고려해야 합니다
-- 특정 기간의 데이터만 조회 SELECT * FROM orders WHERE order_date BETWEEN '2024-01-01' AND '2024-01-31 23:59:59';
JOIN 조건에서 BETWEEN 활용하기
일반적인 JOIN은 고정된 키로 매칭하지만, 기간 기반 JOIN은 다릅니다.
-- 일반 JOIN: ID로 매칭 SELECT * FROM orders o JOIN customers c ON o.customer_id = c.customer_id; -- 기간 기반 JOIN: 날짜 범위로 매칭 SELECT * FROM orders o LEFT JOIN promotions p ON o.order_date BETWEEN p.start_date AND p.end_date;
이 패턴의 의미는:
"주문이 발생한 날짜가 프로모션 기간 내에 있으면 매칭하라"
LEFT JOIN을 사용하는 이유
-- INNER JOIN: 프로모션이 있는 주문만 SELECT o.order_id, p.promotion_name FROM orders o INNER JOIN promotions p ON o.order_date BETWEEN p.start_date AND p.end_date; -- LEFT JOIN: 모든 주문 포함 (프로모션 없어도 OK) SELECT o.order_id, p.promotion_name FROM orders o LEFT JOIN promotions p ON o.order_date BETWEEN p.start_date AND p.end_date;
LEFT JOIN을 사용하면:
- 프로모션이 없던 기간의 주문도 조회됩니다
- 매칭되지 않은 경우 프로모션 정보는
NULL로 표시됩니다 - 전체 그림을 볼 수 있습니다
실전 문제 미리보기
온라인 쇼핑몰에서 여러 프로모션을 진행하고 있습니다. 각 프로모션마다 시작일과 종료일이 있고, 우리는 2024년 1월의 모든 주문과 함께 해당 시점에 진행 중이던 프로모션 정보를 확인하려고 합니다.
필요한 테이블
orders: 주문 정보
- order_id, customer_id, order_date, total_amount
promotions: 프로모션 정보
- promotion_id, promotion_name, discount_rate, start_date, end_date
생각해볼 포인트
이 문제를 풀 때 고려해야 할 것들:
-
어떤 JOIN을 사용할까?
- 프로모션이 없는 주문도 봐야 할까?
- 모든 주문을 유지하려면?
-
날짜 매칭은 어떻게?
- 주문일이 프로모션 기간 "사이에" 있어야 함
- BETWEEN을 어디에 써야 할까?
-
결과 필터링은?
- 2024년 1월 주문만 보려면?
- WHERE 절에는 무엇을 써야 할까?
ON 절 vs WHERE 절
혼동하기 쉬운 부분입니다:
-- ON 절: JOIN 조건 (어떻게 연결할지) LEFT JOIN promotions p ON o.order_date BETWEEN p.start_date AND p.end_date -- WHERE 절: 결과 필터링 (무엇을 볼지) WHERE o.order_date >= '2024-01-01'
핵심 차이:
ON절: 두 테이블을 어떻게 연결할지 정의WHERE절: 연결된 결과에서 무엇을 보여줄지 결정
다른 활용 사례들
이 패턴은 다양한 상황에 적용됩니다:
직원-프로젝트 매칭
- 직원의 재직 기간 중에 시작한 프로젝트 찾기
구독 서비스 분석
- 사용자의 구독 기간 내 서비스 사용 내역 조회
계약 관리
- 계약 기간 내에 발생한 거래 확인
모두 같은 원리입니다: 특정 시점이 기간 범위 내에 있는지 확인
주의할 점
1. JOIN 타입 선택
-- ❌ INNER JOIN: 일부 데이터가 누락될 수 있음 -- ✅ LEFT JOIN: 매칭 안 되어도 왼쪽 테이블 데이터 유지
2. 날짜 범위의 정확성
-- 시간까지 명확히 지정하기 BETWEEN '2024-01-01 00:00:00' AND '2024-01-31 23:59:59'
3. NULL 처리
LEFT JOIN 결과에서 매칭되지 않은 행은 NULL을 갖습니다.
핵심 정리
✅ BETWEEN은 범위의 양쪽 끝을 포함합니다
✅ LEFT JOIN으로 매칭 실패 데이터도 유지합니다
✅ ON 절에 BETWEEN을 써서 기간 기반 매칭을 구현합니다
✅ WHERE 절은 최종 결과를 필터링합니다
이제 직접 도전해보세요!
개념을 이해했다면, 이제 직접 손으로 쿼리를 작성할 차례입니다.
🔗 프로모션 기간 매칭 문제 링크
실제 데이터로 연습하면서:
- BETWEEN과 LEFT JOIN의 조합을 체득하고
- 기간 기반 매칭 로직을 완벽히 이해하며
- 실무에서 바로 적용 가능한 패턴을 익혀보세요
정답은 여러분이 직접 찾아가는 과정에서 더 큰 의미를 가집니다!
SQL Growth
