[MySQL] 정규표현식 REGEXP

코린이·2025년 6월 10일

MySQL

목록 보기
18/23

MySQL 정규표현식(REGEXP)

MySQL의 WHERE 조건문에서는 다양한 연산자와 LIKE 구문을 사용하여 여러 가지 조건식을 구현할 수 있다.

하지만 복잡한 비즈니스 로직에서는 연산자와 LIKE 구문만으로는 원하는 조건식을 완벽하게 구현하기 어렵다.

이처럼 복잡한 조건식을 처리하기 위해 MySQL에서는 WHERE 조건문에 정규표현식(REGEXP)을 사용한다.

정규표현식 사용 주의 사항

성능이 떨어질 수 있다.

  • 정규표현식(REGEXP)은 일반적으로 FULL SCAN 방식으로 동작되기 때문에 인덱스를 사용할 수 없다.
    이러한 이유로 데이터가 많을수록 효율성이 떨어진다.

각종 오류를 포함할 수 있어 SQL 인젝션에 취약하다.

  • 정규표현식은 특수문자를 많이 사용하기 때문에, 사용자 입력을 적절히 검증하지 않고 쿼리에 포함하면 의도하지 않은 정규식 실행이나 결과 왜곡이 발생할 수 있다.

정규표현식 예시

패턴의미
|OR(또는)
[...]대괄호[ ] 안에 있는 문자 의미
[^...]대괄호[ ] 안에 없는 문자 의미
{n}반복 횟수 n 지정
{m,n}반복 횟수의 최소(m) / 최대(n) 값
-- name에 s가 포함된 데이터 조회
SELECT * FROM TMP_TB WHERE name REGEXP 's';


-- name에 한 글자 이상인 데이터 조회
SELECT * FROM TMP_TB WHERE name REGEXP '.';


-- name에 세 글자 이상인 데이터 조회
SELECT * FROM TMP_TB WHERE name REGEXP '...';


-- name에 다섯 글자 이상인 데이터 중 가운데 글자가 k인 데이터 조회(k 앞에 글자는 두 개 이상, 뒤에 글자도 두 개 이상)
SELECT * FROM TMP_TB WHERE name REGEXP '..k..';


-- name에 다섯 글자 이상인 데이터 중 마지막 글자가 k로 끝나는 데이터 조회
SELECT * FROM TMP_TB WHERE name REGEXP '....k$';


-- name에 다음 글자 A 또는 B 또는 C를 포함하고 있는 데이터 조회
SELECT * FROM TMP_TB WHERE name REGEXP '[ABC]';
SELECT * FROM TMP_TB WHERE name REGEXP 'A|B|C';


-- name에 '김' OR '신' 다음에 '짱구'가 나와야 하는 데이터 조회
-- 김짱구
-- 신짱구
-- 김김짱구 (김/신 앞에 어떠한 글자가 들어가도 됨)
SELECT * FROM TMP_TB WHERE name REGEXP '[김신]짱구';


-- name에 '짱'과 '구'로만 구성된 데이터를 제외
-- '짱구' 제외
-- '구짱' 제외
-- '구짱구' 제외
-- '김철수짱구' 포함
SELECT * FROM TMP_TB WHERE name REGEXP '[^짱구]';


-- name에 첫 글자가 '김'으로 시작되는 데이터 조회
-- 대괄호 외부의 ^는 문자의 첫 시작을 의미 
SELECT * FROM TMP_TB WHERE name REGEXP '^김';


-- name에 첫 글자가 '김' 또는 '박'이 아닌 데이터만 조회
SELECT * FROM TMP_TB WHERE name REGEXP '^[^김박]';


-- name에 '김'이라는 글자가 연속으로 두 번 반복되는 데이터 조회
-- 김김섭
-- 제갈김김
SELECT * FROM TMP_TB WHERE name REGEXP '김{2}';


-- name에 '김'이라는 글자가 연속으로 최소 두 번, 최대 세 번 반복되는 데이터 조회
-- 김김섭
-- 박김김김
SELECT * FROM TMP_TB WHERE name REGEXP '김{2,3}';

0개의 댓글