MySQL의 WHERE 조건문에서는 다양한 연산자와 LIKE 구문을 사용하여 여러 가지 조건식을 구현할 수 있다.
하지만 복잡한 비즈니스 로직에서는 연산자와 LIKE 구문만으로는 원하는 조건식을 완벽하게 구현하기 어렵다.
이처럼 복잡한 조건식을 처리하기 위해 MySQL에서는 WHERE 조건문에 정규표현식(REGEXP)을 사용한다.
성능이 떨어질 수 있다.
각종 오류를 포함할 수 있어 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}';