MySQL에서 REGEXP를 사용해 특정 컬럼에서 숫자만 포함된 행을 조회하고 싶다면, WHERE 절에 정규 표현식을 활용하면 됩니다. 대표적인 패턴은 ^[0-9]*$이며, 상황에 따라 패턴을 조정하면 원하는 결과를 정확하게 얻을 수 있습니다.
정규 표현식 패턴별 사용법
Case 1: 정확히 10자리 숫자인 행만 조회
문자열이 정확히 10자리이며, 전부 숫자로만 구성된 행만 가져오려면 아래와 같이 중괄호 {10}을 사용해 자릿수를 지정합니다.
SELECT * FROM yourTableName
WHERE yourColumnName REGEXP '^[0-9]{10}$';
Case 2: 숫자가 한 개 이상 포함된 행만 조회
숫자가 한 개 이상 포함되어 있고, 그 외의 문자가 전혀 없는 행만 조회하려면 다음 구문을 사용합니다.
SELECT * FROM yourTableName
WHERE yourColumnName REGEXP '^[0-9]*$';
이 구문은 문자가 하나도 섞여 있지 않은, 오직 숫자로만 이루어진 행만 반환합니다.
예제 테이블 생성 및 데이터 입력
실제 동작을 확인하기 위해 예제 테이블을 만들고 데이터를 삽입해 보겠습니다.
mysql> insert into OnlyDigits(UserId, UserName) values('123User1','John');
Query OK, 1 row affected (0.16 sec)
mysql> insert into OnlyDigits(UserId, UserName) values('3445User2','Carol');
Query OK, 1 row affected (0.19 sec)
mysql> insert into OnlyDigits(UserId, UserName) values('145363User3','Mike');
Query OK, 1 row affected (0.20 sec)
mysql> insert into OnlyDigits(UserId, UserName) values('13455User4','Larry');
Query OK, 1 row affected (0.22 sec)
mysql> insert into OnlyDigits(UserId, UserName) values('123555User5','Sam');
Query OK, 1 row affected (0.15 sec)
mysql> insert into OnlyDigits(UserId, UserName) values('596766User6','David');
Query OK, 1 row affected (0.24 sec)
mysql> insert into OnlyDigits(UserId, UserName) values('96977User7','Robert');
Query OK, 1 row affected (0.15 sec)
mysql> insert into OnlyDigits(UserId, UserName) values('99999User8','James');
Query OK, 1 row affected (0.20 sec)
mysql> insert into OnlyDigits(UserId, UserName) values('9999999','James');
Query OK, 1 row affected (0.13 sec)
mysql> insert into OnlyDigits(UserId, UserName) values('153545','Maxwell');
Query OK, 1 row affected (0.23 sec)
mysql> insert into OnlyDigits(UserId, UserName) values('9999986787','Johnson');
Query OK, 1 row affected (0.20 sec)이제 SELECT 문으로 테이블의 전체 레코드를 조회해 보겠습니다.
mysql> select *from OnlyDigits;
실행 결과는 다음과 같습니다.
+----+-------------+----------+
| Id | UserId | UserName |
+----+-------------+----------+
| 1 | 123User1 | John |
| 2 | 3445User2 | Carol |
| 3 | 145363User3 | Mike |
| 4 | 13455User4 | Larry |
| 5 | 123555User5 | Sam |
| 6 | 596766User6 | David |
| 7 | 96977User7 | Robert |
| 8 | 99999User8 | James |
| 9 | 9999999 | James |
| 10 | 153545 | Maxwell |
| 11 | 9999986787 | Johnson |
+----+-------------+----------+
11 rows in set (0.00 sec)
Case 1 실행 결과: 정확히 10자리 숫자 조회
문자열이 정확히 10자리이고 모두 숫자여야 하는 조건의 쿼리는 다음과 같습니다.
mysql> select *from OnlyDigits
-> where UserId REGEXP '^[0-9]{10}$';
실행 결과는 다음과 같습니다.
+----+------------+----------+
| Id | UserId | UserName |
+----+------------+----------+
| 11 | 9999986787 | Johnson |
+----+------------+----------+
1 row in set (0.00 sec)
대체 표현식: [[:digit:]] 사용
Case 1은 POSIX 문자 클래스인 [[:digit:]]를 사용해도 동일한 결과를 얻을 수 있습니다.
mysql> select *from OnlyDigits
-> where UserId REGEXP '^[[:digit:]]{10}$';
실행 결과는 다음과 같습니다.
+----+------------+----------+
| Id | UserId | UserName |
+----+------------+----------+
| 11 | 9999986787 | Johnson |
+----+------------+----------+
1 row in set (0.00 sec)
Case 2 실행 결과: 숫자로만 구성된 행 조회
숫자가 한 개 이상 포함되고 다른 문자가 없는 행만 조회하는 쿼리는 다음과 같습니다.
mysql> select *from OnlyDigits
-> where UserId REGEXP '^[0-9]*$';
실행 결과는 다음과 같습니다.
+----+------------+----------+
| Id | UserId | UserName |
+----+------------+----------+
| 9 | 9999999 | James |
| 10 | 153545 | Maxwell |
| 11 | 9999986787 | Johnson |
+----+------------+----------+
3 rows in set (0.00 sec)
정리
MySQL에서 REGEXP로 숫자만 추출할 때 핵심은 앵커(^, $)와 수량자(*, {n})의 조합입니다. ^[0-9]{10}$처럼 자릿수를 고정하면 정확한 길이의 숫자만 필터링되고, ^[0-9]*$를 사용하면 길이에 상관없이 숫자로만 구성된 모든 행을 조회할 수 있습니다. 데이터 검증이나 이상 데이터 탐색 시 유용하게 활용해 보시기 바랍니다.