MySQL에서 특정 컬럼의 첫 번째 문자가 영숫자(alphanumeric)가 아닌 행을 조회해야 하는 경우, REGEXP 연산자와 정규 표현식을 사용하면 손쉽게 처리할 수 있습니다. 상황별로 자주 사용되는 두 가지 패턴을 예제와 함께 살펴보겠습니다.
1. 기본 쿼리 패턴
Case 1. 첫 문자가 숫자인 행 조회
첫 글자가 숫자(0~9)로 시작하는 행만 가져오려면 아래 구문을 사용합니다.
SELECT * FROM yourTableName WHERE yourColumnName REGEXP '^[0-9]';
Case 2. 첫 문자가 영숫자가 아닌 행 조회
첫 글자가 영숫자(0~9, A~Z, a~z)가 아닌 문자, 즉 특수문자(@, #, $ 등)로 시작하는 행을 가져오려면 다음 구문을 사용합니다.
SELECT * FROM yourTableName WHERE yourColumnName REGEXP '^[^0-9A-Za-z]';
여기서 패턴 맨 앞의 ^(캐럿)는 "문자열의 시작"을 의미하고, 대괄호 [...] 안의 ^는 부정(not)을 뜻합니다. 따라서 '^[^0-9A-Za-z]'는 "첫 문자가 영숫자 범위에 포함되지 않는 경우", 즉 특수문자로 시작하는 값에 일치합니다.
2. 예제 테이블 준비
실제 동작을 확인하기 위해 테스트용 테이블을 생성합니다.
mysql> create table getRowsFirstNotAlphanumeric
-> (
-> Id int NOT NULL AUTO_INCREMENT,
-> UserPassword varchar(20),
-> PRIMARY KEY(Id)
-> );
Query OK, 0 rows affected (0.61 sec)
INSERT 문을 이용해 샘플 데이터를 입력합니다.
mysql> insert into getRowsFirstNotAlphanumeric(UserPassword) values('@123456');
Query OK, 1 row affected (0.19 sec)
mysql> insert into getRowsFirstNotAlphanumeric(UserPassword) values('#7666666');
Query OK, 1 row affected (0.22 sec)
mysql> insert into getRowsFirstNotAlphanumeric(UserPassword) values('98876Carol');
Query OK, 1 row affected (0.16 sec)
mysql> insert into getRowsFirstNotAlphanumeric(UserPassword) values('$12345Carol');
Query OK, 1 row affected (0.09 sec)
mysql> insert into getRowsFirstNotAlphanumeric(UserPassword) values('%David567');
Query OK, 1 row affected (0.10 sec)
mysql> insert into getRowsFirstNotAlphanumeric(UserPassword) values('123456Larry');
Query OK, 1 row affected (0.07 sec)
mysql> insert into getRowsFirstNotAlphanumeric(UserPassword) values('909Robert');
Query OK, 1 row affected (0.12 sec)
mysql> insert into getRowsFirstNotAlphanumeric(UserPassword) values('3333Maxwell');
Query OK, 1 row affected (0.09 sec)
mysql> insert into getRowsFirstNotAlphanumeric(UserPassword) values('_123456Bob');
Query OK, 1 row affected (0.10 sec)
mysql> insert into getRowsFirstNotAlphanumeric(UserPassword) values('5767676Chris');
Query OK, 1 row affected (0.10 sec)
mysql> insert into getRowsFirstNotAlphanumeric(UserPassword) values('(88883Mike');
Query OK, 1 row affected (0.11 sec)
저장된 전체 데이터를 SELECT 문으로 확인해 보겠습니다.
mysql> select *from getRowsFirstNotAlphanumeric;
실행 결과는 다음과 같습니다.
+----+--------------+ | Id | UserPassword | +----+--------------+ | 1 | @123456 | | 2 | #7666666 | | 3 | 98876Carol | | 4 | $12345Carol | | 5 | %David567 | | 6 | 123456Larry | | 7 | 909Robert | | 8 | 3333Maxwell | | 9 | _123456Bob | | 10 | 5767676Chris | | 11 | (88883Mike | +----+--------------+ 11 rows in set (0.00 sec)
3. 쿼리 실행 결과 확인
Case 1. 숫자로 시작하는 행 조회 결과
mysql> SELECT *FROM getRowsFirstNotAlphanumeric
-> WHERE UserPassword REGEXP '^[0-9]';
실행 결과:
+----+--------------+ | Id | UserPassword | +----+--------------+ | 3 | 98876Carol | | 6 | 123456Larry | | 7 | 909Robert | | 8 | 3333Maxwell | | 10 | 5767676Chris | +----+--------------+ 5 rows in set (0.00 sec)
Case 2. 영숫자가 아닌 문자로 시작하는 행 조회 결과
mysql> SELECT *FROM getRowsFirstNotAlphanumeric
-> WHERE UserPassword REGEXP '^[^0-9A-Za-z]';
실행 결과:
+----+--------------+ | Id | UserPassword | +----+--------------+ | 1 | @123456 | | 2 | #7666666 | | 4 | $12345Carol | | 5 | %David567 | | 9 | _123456Bob | | 11 | (88883Mike | +----+--------------+ 6 rows in set (0.00 sec)
4. 마무리
이처럼 MySQL에서는 REGEXP 연산자와 캐럿(^) 기호를 조합하면 문자열의 시작 위치를 기준으로 원하는 패턴의 행을 간편하게 필터링할 수 있습니다. 숫자로 시작하는 데이터와 특수문자로 시작하는 데이터를 분리해 처리해야 하는 데이터 검증, 비밀번호 규칙 점검 등의 작업에 실무적으로 유용하게 활용할 수 있습니다.