반응형
Ant_U
DBA 개미
Ant_U
전체 방문자
오늘
어제
  • 분류 전체보기 (273)
    • AWS (3)
    • C# (1)
    • SQL (247)
      • MYSQL (197)
      • MSSQL (50)
    • 자격증 (20)
      • SQLD (12)
      • SQLP (8)

인기 글

최근 글

250x250
hELLO · Designed By 정상우.
Ant_U

DBA 개미

[MySQL] BETWEEN 연산자 가이드: 범위 검색의 효율성과 주의사항
SQL/MYSQL

[MySQL] BETWEEN 연산자 가이드: 범위 검색의 효율성과 주의사항

2026. 2. 27. 10:59
728x90
반응형

 

도입: 범위 검색의 표준, BETWEEN 연산자

데이터베이스 관리 과정에서 특정 범위 내의 데이터를 추출하는 작업은 매우 빈번하게 발생합니다. 매출액이 일정 금액 사이인 주문을 찾거나, 특정 기간 동안 발생한 로그를 조회하는 것이 대표적인 예입니다. MySQL에서 이러한 작업을 수행할 때 가장 먼저 떠오르는 도구가 바로 BETWEEN 연산자입니다.

BETWEEN 연산자는 쿼리의 가독성을 높여주지만, 동작 원리를 정확히 이해하지 못하면 예상치 못한 결과나 성능 저하를 초래할 수 있습니다. 특히 데이터 타입에 따른 처리 방식과 MySQL 버전별 최적화 차이를 아는 것은 숙련된 개발자로 성장하기 위한 필수 과정입니다. 본 포스팅에서는 BETWEEN 연산자의 기초부터 실무 적용 시 주의해야 할 깊이 있는 내용까지 다루어 보겠습니다.


1. BETWEEN의 기본 개념과 포함 관계 (Inclusivity)

BETWEEN 연산자는 지정된 두 값 사이에 있는 데이터를 필터링하는 데 사용됩니다. 구문론적으로는 가독성이 뛰어나며, 내부적으로는 크거나 같음(>=)과 작거나 같음(<=) 조건이 AND로 결합된 것과 동일하게 동작합니다.

SELECT column_name FROM table_name WHERE column_name BETWEEN value1 AND value2;

 

여기서 가장 중요한 사실은 BETWEEN이 양 끝의 경계값을 포함하는 폐구간(Closed Interval)이라는 점입니다. 예를 들어 BETWEEN 1 AND 10이라는 조건을 사용하면, 1과 10인 레코드도 결과에 포함됩니다. 주니어 개발자들이 흔히 하는 실수 중 하나가 경계값을 제외해야 하는 상황에서도 습관적으로 BETWEEN을 사용하는 것입니다. 만약 경계값을 제외해야 한다면 비교 연산자인 >와 <를 명시적으로 사용하는 것이 정확합니다.


2. 데이터 타입별 동작 특징과 날짜 데이터의 함정

BETWEEN 연산자는 숫자뿐만 아니라 문자열, 날짜 타입에도 사용할 수 있지만 각각 주의사항이 다릅니다.

숫자형 데이터 가장 직관적으로 동작합니다. 정수나 실수 범위 내의 값을 정확히 비교하며 인덱스 효율도 매우 높습니다.

문자형 데이터 문자열에 BETWEEN을 사용하면 해당 컬럼의 콜레이션(Collation)에 따라 사전식 순서(Lexicographical Order)로 비교됩니다. 예를 들어 'A'와 'C' 사이를 검색하면 'B'로 시작하는 문자열은 포함되지만, 대소문자 구분 여부는 데이터베이스 설정에 따라 달라질 수 있으므로 주의가 필요합니다.

날짜 및 시간 데이터 (DATETIME) 이 부분은 시니어 개발자들도 종종 실수하는 지점입니다. DATE 타입에서는 큰 문제가 없으나, 시간 정보가 포함된 DATETIME이나 TIMESTAMP 타입을 다룰 때는 매우 신중해야 합니다. 예를 들어 BETWEEN '2026-02-01' AND '2026-02-02'라고 쿼리를 작성하면, MySQL은 두 번째 날짜를 '2026-02-02 00:00:00'으로 해석합니다. 결과적으로 2월 2일 오전 10시에 발생한 데이터는 결과에서 누락됩니다. 2월 2일의 모든 데이터를 포함하려면 '2026-02-02 23:59:59'와 같이 시간을 명시하거나, BETWEEN 대신 >= '2026-02-01' AND < '2026-02-03'과 같은 방식의 비교 연산자를 사용하는 것이 더 안전합니다.


3. 인덱스 최적화와 MySQL 버전별 변화

MySQL 엔진이 발전함에 따라 BETWEEN과 같은 범위 조건 쿼리를 처리하는 방식도 개선되었습니다.

인덱스 활용과 범위 최적화 도구 (Range Optimizer) BETWEEN 조건이 걸린 컬럼에 인덱스가 있다면, MySQL의 범위 최적화 도구는 인덱스 트리 내에서 시작점과 끝점을 빠르게 찾아 스캔합니다. 이는 전체 테이블을 읽는 것보다 훨씬 효율적입니다. MySQL 8.0 이상에서는 이러한 범위 스캔 성능이 더욱 강화되었으며, 특히 다중 컬럼 인덱스(Composite Index)에서 범위 조건 뒤에 오는 컬럼들의 활용도가 이전 버전보다 개선되었습니다.

암시적 형변환(Implicit Casting) 방지 MySQL 5.7 이전 버전이나 8.0 초기 버전에서도 공통적으로 나타나는 현상이지만, BETWEEN의 양 끝값과 컬럼의 데이터 타입이 일치하지 않으면 MySQL은 암시적으로 형변환을 시도합니다. 예를 들어 문자열 컬럼을 숫자값으로 BETWEEN 비교를 하면 인덱스를 타지 못하고 성능이 급격히 저하됩니다. 쿼리를 작성할 때는 항상 컬럼의 타입과 비교 값의 타입을 일치시키는 습관을 들여야 합니다.

NULL 값의 처리 BETWEEN 연산에서 컬럼 값이나 경계값 중 하나라도 NULL이면 결과는 UNKNOWN이 되어 해당 행은 결과 집합에서 제외됩니다. 이는 NOT BETWEEN의 경우에도 마찬가지입니다. NULL 가능성이 있는 컬럼에 대해서는 별도의 NULL 체크 로직(IS NULL 등)을 병행해야 합니다.


결론 및 실무 적용을 위한 팁

BETWEEN 연산자는 단순해 보이지만 데이터의 정확성과 쿼리 성능을 좌우할 수 있는 중요한 요소입니다. 실무에서 적용할 수 있는 핵심 요약은 다음과 같습니다.

  1. 포함 관계 확인: 시작값과 끝값이 결과에 포함되어도 무방한지 반드시 확인하십시오.
  2. 날짜 시간 처리의 정석: DATETIME 컬럼에는 BETWEEN 대신 부등호(>=, <)를 사용하여 다음 날 0시를 기준으로 범위를 잡는 것이 논리적 오류를 방지하는 가장 좋은 방법입니다.
  3. 타입 일치: 인덱스 효율을 극대화하기 위해 비교 대상의 데이터 타입을 컬럼 타입과 일치시키십시오.

이러한 세부 사항들을 고려하여 쿼리를 작성한다면, 더 견고하고 빠른 데이터베이스 시스템을 구축할 수 있을 것입니다.


공식 문서 링크

더욱 자세한 사양과 연산자 우선순위 등은 MySQL 공식 레퍼런스 매뉴얼에서 확인하실 수 있습니다. https://dev.mysql.com/doc/refman/8.0/en/comparison-operators.html#operator_between

728x90
반응형

'SQL > MYSQL' 카테고리의 다른 글

[MySQL] 쿼리 최적화의 기본: IN과 NOT IN 연산자의 동작 원리와 성능 분석  (0) 2026.02.09
[MySQL] LIKE 연산자 활용법과 성능 최적화 가이드 (인덱스 활용 및 주의사항)  (0) 2026.02.05
[MySQL] 논리 연산자 완벽 가이드: AND, OR, NOT 제대로 사용하기  (0) 2026.02.03
[MySQL] WHERE 절 완전 정복: 기본 문법부터 8.0 최적화 팁까지  (0) 2026.01.30
[MySQL] DISTINCT: 중복된 데이터를 세련되게 처리하는 기술 (기초부터 성능 최적화까지)  (0) 2026.01.29
[MySQL] 백틱(`)의 역할과 올바른 사용법: 언제 써야 하고, 언제 피해야 할까?  (0) 2026.01.28
[MySQL] 습관적으로 쓴 SELECT * 가 당신의 DB를 느리게 만드는 이유 (feat. 실행 계획 분석)  (0) 2026.01.27
[MySQL] 에러 핸들링의 숨은 조력자: SHOW ERRORS 문 완벽 가이드  (0) 2026.01.26
    'SQL/MYSQL' 카테고리의 다른 글
    • [MySQL] 쿼리 최적화의 기본: IN과 NOT IN 연산자의 동작 원리와 성능 분석
    • [MySQL] LIKE 연산자 활용법과 성능 최적화 가이드 (인덱스 활용 및 주의사항)
    • [MySQL] 논리 연산자 완벽 가이드: AND, OR, NOT 제대로 사용하기
    • [MySQL] WHERE 절 완전 정복: 기본 문법부터 8.0 최적화 팁까지
    Ant_U
    Ant_U

    티스토리툴바