MySQL BETWEEN에서 경계값(끝점) 제외하기
MySQL의 BETWEEN 연산자는 기본적으로 시작값과 끝값을 모두 포함하는 '폐쇄 범위' 조건입니다. 즉, WHERE age BETWEEN 20 AND 30이라고 작성하면 20과 30 역시 결과에 포함됩니다.
그렇다면 범위 조회는 하되 시작점이나 끝점은 결과에서 빼고 싶다면 어떻게 해야 할까요? 가장 간단한 방법은 BETWEEN과 NOT IN을 함께 사용하는 것입니다.
1. 기본 문법
끝값만 제외하고 싶은 경우에는 다음과 같은 형태로 쿼리를 작성합니다.
SELECT * FROM yourTableName
WHERE yourColumnName BETWEEN yourStartingValue AND yourEndingValue
AND yourColumnName NOT IN (yourEndingValue);
시작값까지 모두 제외하고 싶다면 NOT IN 절에 두 값을 함께 나열하면 됩니다.
... AND yourColumnName NOT IN (yourStartingValue, yourEndingValue);
2. 예제 테이블 만들기
문법을 실제로 확인해 보기 위해 예제 테이블을 먼저 생성하겠습니다.
mysql> create table BetweenWithoutEndPoints
-> (
-> Id int NOT NULL AUTO_INCREMENT,
-> Name varchar(20),
-> Age int,
-> PRIMARY KEY(Id)
-> );
Query OK, 0 rows affected (0.54 sec)
3. 샘플 데이터 입력
INSERT 문으로 이름과 나이 데이터를 차례대로 넣어 줍니다.
mysql> insert into BetweenWithoutEndPoints(Name,Age) values('Mike',23);
mysql> insert into BetweenWithoutEndPoints(Name,Age) values('Larry',25);
mysql> insert into BetweenWithoutEndPoints(Name,Age) values('David',28);
mysql> insert into BetweenWithoutEndPoints(Name,Age) values('Sam',26);
mysql> insert into BetweenWithoutEndPoints(Name,Age) values('Carol',21);
mysql> insert into BetweenWithoutEndPoints(Name,Age) values('John',29);
mysql> insert into BetweenWithoutEndPoints(Name,Age) values('James',20);
mysql> insert into BetweenWithoutEndPoints(Name,Age) values('Robert',26);
mysql> insert into BetweenWithoutEndPoints(Name,Age) values('Michael',30);
각 INSERT 문이 성공적으로 실행되면 'Query OK, 1 row affected'라는 메시지가 출력됩니다.
4. 전체 데이터 조회
SELECT 문으로 입력된 전체 레코드를 확인합니다.
mysql> select * from BetweenWithoutEndPoints;
실행 결과는 다음과 같습니다.
+----+---------+------+ | Id | Name | Age | +----+---------+------+ | 1 | Mike | 23 | | 2 | Larry | 25 | | 3 | David | 28 | | 4 | Sam | 26 | | 5 | Carol | 21 | | 6 | John | 29 | | 7 | James | 20 | | 8 | Robert | 26 | | 9 | Michael | 30 | +----+---------+------+ 9 rows in set (0.00 sec)
5. 시작점과 끝점 모두 제외하기
Id가 3부터 8 사이인 행을 조회하되, 3과 8 자체는 결과에서 제외하고 싶다면 아래처럼 작성합니다.
mysql> select * from BetweenWithoutEndPoints
-> where Id between 3 and 8 and Id not in (3, 8);
실행 결과:
+----+-------+------+ | Id | Name | Age | +----+-------+------+ | 4 | Sam | 26 | | 5 | Carol | 21 | | 6 | John | 29 | | 7 | James | 20 | +----+-------+------+ 4 rows in set (0.04 sec)
경계값에 해당하는 3번(David)과 8번(Robert)이 빠진 채 4개의 행만 반환된 것을 확인할 수 있습니다.
6. 끝점만 제외하기
반대로 끝값만 제외하고 시작값은 그대로 포함하고 싶다면 NOT IN에 끝값 하나만 지정하면 됩니다.
mysql> select * from BetweenWithoutEndPoints
-> where Id between 3 and 8 and Id not in (8);
실행 결과:
+----+-------+------+ | Id | Name | Age | +----+-------+------+ | 3 | David | 28 | | 4 | Sam | 26 | | 5 | Carol | 21 | | 6 | John | 29 | | 7 | James | 20 | +----+-------+------+ 5 rows in set (0.03 sec)
이번에는 8번(Robert)만 제외되고 3번(David)은 그대로 포함되어 총 5개의 행이 조회되었습니다.
마무리 정리
- BETWEEN은 시작값과 끝값을 모두 포함하는 연산자입니다.
- 양쪽 경계값을 모두 제외하려면
NOT IN (시작값, 끝값)을 추가합니다. - 끝값만 제외하려면
NOT IN (끝값), 시작값만 제외하려면NOT IN (시작값)을 사용합니다. - 참고로 비교 연산자를 조합해도 같은 결과를 얻을 수 있습니다. 예를 들어 양쪽 경계를 제외한 열린 범위는
WHERE Id > 3 AND Id < 8처럼 표현할 수 있습니다.