Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL BETWEEN 연산자에서 시작값과 끝값 제외하는 방법

BETWEEN 연산자의 기본 동작과 한계

MySQL의 BETWEEN 연산자는 지정한 범위 내의 데이터를 조회할 때 매우 유용하지만, 기본적으로 시작값과 끝값을 모두 포함한다는 특징이 있습니다. 따라서 경계값을 제외한 범위 내부의 데이터만 조회하고 싶다면 별도의 처리가 필요합니다.

경계값을 제외하는 쿼리 문법

시작값과 끝값을 결과에서 제외하려면 BETWEENNOT IN을 조합하여 아래와 같이 작성할 수 있습니다.

SELECT * FROM yourTableName 
WHERE yourColumnName BETWEEN yourStartingValue AND yourEndingValue 
  AND yourColumnName NOT IN (yourStartingValue, yourEndingValue);

이 문법은 먼저 BETWEEN으로 범위를 필터링한 뒤, NOT IN으로 양쪽 경계값을 다시 걸러내는 방식으로 동작합니다.

실습용 테이블 생성

문법을 이해하기 위해 예제 테이블을 만들어 보겠습니다. 테이블 생성 쿼리는 다음과 같습니다.

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)

샘플 데이터 삽입

INSERT 명령어를 사용해 테이블에 레코드를 추가합니다.

mysql> insert into BetweenWithoutEndPoints(Name,Age) values('Mike',23);
Query OK, 1 row affected (0.21 sec)

mysql> insert into BetweenWithoutEndPoints(Name,Age) values('Larry',25);
Query OK, 1 row affected (0.21 sec)

mysql> insert into BetweenWithoutEndPoints(Name,Age) values('David',28);
Query OK, 1 row affected (0.16 sec)

mysql> insert into BetweenWithoutEndPoints(Name,Age) values('Sam',26);
Query OK, 1 row affected (0.15 sec)

mysql> insert into BetweenWithoutEndPoints(Name,Age) values('Carol',21);
Query OK, 1 row affected (0.14 sec)

mysql> insert into BetweenWithoutEndPoints(Name,Age) values('John',29);
Query OK, 1 row affected (0.18 sec)

mysql> insert into BetweenWithoutEndPoints(Name,Age) values('James',20);
Query OK, 1 row affected (0.41 sec)

mysql> insert into BetweenWithoutEndPoints(Name,Age) values('Robert',26);
Query OK, 1 row affected (0.17 sec)

mysql> insert into BetweenWithoutEndPoints(Name,Age) values('Michael',30);
Query OK, 1 row affected (0.16 sec)

전체 데이터 확인

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)

경계값 제외 쿼리 실행

이제 시작점과 끝점을 제외한 BETWEEN 쿼리를 실행해 보겠습니다. 아래 쿼리는 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)

결과에서 확인할 수 있듯이 Id 3(David)과 Id 8(Robert)은 제외되고, 그 사이의 4개 행만 반환되었습니다.

더 간결한 대안: 비교 연산자 활용

사실 위와 동일한 결과는 비교 연산자를 사용하면 더 간결하게 얻을 수 있습니다.

SELECT * FROM BetweenWithoutEndPoints WHERE Id > 3 AND Id < 8;

>(초과)와 <(미만) 연산자는 경계값을 애초에 포함하지 않기 때문에, NOT IN을 추가로 작성할 필요가 없어 코드가 더 깔끔해집니다. 상황에 맞게 두 방식 중 편한 방법을 선택하면 됩니다.