Logo SQL Growth

프로모션 기간 매칭하기: BETWEEN과 LEFT JOIN의 실전 활용

by DataMarvin
Nov 23, 2025
Views: 36
Illustrative Image

왜 이 개념이 중요한가?

실무에서는 단순히 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

생각해볼 포인트

이 문제를 풀 때 고려해야 할 것들:

  1. 어떤 JOIN을 사용할까?

    • 프로모션이 없는 주문도 봐야 할까?
    • 모든 주문을 유지하려면?
  2. 날짜 매칭은 어떻게?

    • 주문일이 프로모션 기간 "사이에" 있어야 함
    • BETWEEN을 어디에 써야 할까?
  3. 결과 필터링은?

    • 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의 조합을 체득하고
  • 기간 기반 매칭 로직을 완벽히 이해하며
  • 실무에서 바로 적용 가능한 패턴을 익혀보세요

정답은 여러분이 직접 찾아가는 과정에서 더 큰 의미를 가집니다!

More

Based on Tags

No related posts found based on the tags.

Recent Popular

Most Popular

  • SQL SELECT 가이드

    SQL SELECT 기초부터 실전 활용까지

    Illustrative Image
  • 데이터 분석을 위한 SQL 입문 - 왜 SQL부터 시작해야 할까?

    SQL이 첫번째 언어여야 하는 이유

    Illustrative Image
  • SQL로 전환 여부 파악하기

    클릭은 있지만 전환은 없는 셀러 찾기

    Illustrative Image