MySQL에서 여러 개의 값을 조건으로 조회할 때 일반적으로 IN() 연산자를 사용하지만, 정규 표현식(REGEXP)을 활용하면 IN()과 동일한 결과를 얻을 수도 있습니다. 이 글에서는 REGEXP를 이용해 IN()처럼 동작하는 쿼리를 작성하는 방법을 예제와 함께 살펴보겠습니다.
REGEXP를 활용한 기본 문법
REGEXP로 IN()과 유사한 기능을 구현하는 기본 문법은 다음과 같습니다. 파이프(|) 기호로 여러 값을 구분하면 OR 조건처럼 동작합니다.
select *from yourTableName where yourColumName regexp 'value1|value2|value3……|valueN';
예제 테이블 생성
실습을 위해 먼저 테이블을 생성하겠습니다.
mysql> create table INDemo
-> (
-> Id int,
-> Name varchar(100)
-> );
Query OK, 0 rows affected (0.90 sec)
샘플 데이터 삽입
생성한 테이블에 레코드를 삽입합니다.
mysql> insert into INDemo values(100,'John');
Query OK, 1 row affected (0.13 sec)
mysql> insert into INDemo values(104,'Carol');
Query OK, 1 row affected (0.18 sec)
mysql> insert into INDemo values(108,'David');
Query OK, 1 row affected (0.19 sec)
mysql> insert into INDemo values(112,'Smith');
Query OK, 1 row affected (0.12 sec)
mysql> insert into INDemo values(116,'Johnson');
Query OK, 1 row affected (0.17 sec)
mysql> insert into INDemo values(120,'Sam');
Query OK, 1 row affected (0.16 sec)
전체 데이터 확인
SELECT 문으로 저장된 전체 레코드를 조회해 보겠습니다.
mysql> select *from INDemo;
실행 결과는 다음과 같습니다.
+------+---------+
| Id | Name |
+------+---------+
| 100 | John |
| 104 | Carol |
| 108 | David |
| 112 | Smith |
| 116 | Johnson |
| 120 | Sam |
+------+---------+
6 rows in set (0.00 sec)
REGEXP로 IN()처럼 조회하기
앞서 소개한 문법을 적용해 Id가 112, 116, 100인 레코드를 REGEXP로 조회해 보겠습니다.
mysql> select *from INDemo where Id regexp '112|116|100';
실행 결과는 다음과 같습니다.
+------+---------+
| Id | Name |
+------+---------+
| 100 | John |
| 112 | Smith |
| 116 | Johnson |
+------+---------+
3 rows in set (0.21 sec)
IN()과 결과 비교
동일한 조건을 IN()으로 실행해 결과를 비교해 보겠습니다.
mysql> select *from INDemo where Id IN(112,116,100);
실행 결과는 다음과 같습니다.
+------+---------+
| Id | Name |
+------+---------+
| 100 | John |
| 112 | Smith |
| 116 | Johnson |
+------+---------+
3 rows in set (0.00 sec)
위 출력에서 볼 수 있듯이 두 쿼리는 완전히 동일한 결과를 반환합니다.
정리 및 주의 사항
REGEXP는 IN()의 대안이 될 수 있지만, 사용 시 몇 가지 유의할 점이 있습니다.
1. 부분 문자열 매칭에 주의: REGEXP는 값의 일부만 일치해도 매칭됩니다. 예를 들어 regexp '112'는 Id가 1120인 레코드에도 매칭될 수 있습니다. 정확한 값 매칭이 필요하다면 ^112$처럼 시작(^)과 끝($) 앵커를 함께 사용하는 것이 안전합니다.
2. 성능 차이: REGEXP는 각 행마다 정규식 검사를 수행하므로 인덱스를 효율적으로 활용하기 어렵고, 실행 시간도 더 오래 걸릴 수 있습니다(위 예제에서도 0.00초 vs 0.21초). 단순히 여러 값을 비교하는 목적이라면 성능 면에서 IN()을 사용하는 것이 좋습니다.
3. REGEXP가 유리한 경우: 값의 패턴 자체가 유동적인 경우, 예를 들어 특정 접두사나 접미사를 포함하는 여러 형태의 값을 한 번에 찾아야 할 때는 REGEXP가 더 강력하고 유연한 선택지가 됩니다.