MySQL - like와 REGEXP
[ like ]
like로는 간단한 걸 검색할 수 있게 도와준다. 와일드카드 개수도 몇 개 없고 간단해서 조건이 어렵지 않은 거라면 like를 사용하는 걸 권장한다.
MySQL에서 제공하는 와일드카드 목록은 아래와 같다.
심볼 | 설명 | 예시 |
% | %는 해당 부분 뒤에 어떤 게 오건 해당 부분을 제외한 부분만 일치하면 된다. | bl%이면 blob, blak, bl이 매치된다. %bl%이면 bl, cblob, black이 매치된다. |
_ | _는 딱 한 개의 문자만 일치해야 한다. | h_t이면 hot, hat, hit이 매치된다. |
[] | 브라켓 내부 하나의 문자만 일치해도 된다. | h[oa]t이면 hot과 hat은 되지만 hit 안 됨 J[so]n이면 Jsn, Jon은 되지만 Json 안 됨 |
^ | 브라켓 내부에 있는거만 아니면 됨. | h[^oa]이면 hit은 되지만 hot, hat 안 됨 |
- | 브라켓과 비슷한데 각각이 아니라 범위로 가능 | c[a-c]t이면 cat, cbt, cct만 됨 |
예제 1. 이름이 ca로 시작하는 나라 찾기(Canada)
where country_name like 'ca%';
예제 2. 이름에 an이 들어가는 나라 찾기(Canada, Japan)
where country_name like '%an%';
예제 3. 이름이 시작은 h로 시작하고 중간은 1글자에 마지막은 t로 끝나는 단어 찾기(cat, cut)
where word like 'c_t';
예제 4. 이름이 시작은 h로 시작하고 중간은 a가 아닌 단어 찾기(cat, cut이 있으면 cut만 검색)
where word like 'c[^a]t';
예제 5. cat과 cut만 검색하기
where word like 'c[au]t';
[ REGEXP ]
like랑 비슷하게 검색할 때 사용하는데 훨신 복잡한 걸 사용할 수 있다. 예를 들면 이메일이라던가, 전화번호 , IP 주소 같은 게 가능하다. 잘 정리된 글이 있어서 해당 글에서 가져오고 위에서 언급한 3가지 예시를 남기도록 하겠다.
Matching
Pattern | 기능 |
. | 문자 하나 |
|(수직선 \ + shift) | |로 구분된 문자에 해당하는 문자열을 찾음. |
[] | [] 안에 나열된 패턴에 해당하는 문자열을 찾음 |
^ | 시작하는 문자열을 찾음 |
$ | 끝나는 문자열을 찾음 |
Numbers Limit
Pattern | 기능 |
* | 0회 이상 나타내는 문자 |
+ | 1회 이상 나타내는 문자 |
{m,n} | m회 이상 n회 이하 반복되는 문자 |
? | 0~1회 나타내는 문자 |
String Group
Pattern | 기능 |
[A-Za-z] 또는 [:alpha:] 또는 \a | 알파벳 대문자 또는 소문자인 문자열을 찾음 |
[0-9] 또는 [:digit:] 또는 \d | 숫자인 문자열을 찾음 |
Not
Pattern | 기능 |
[^문자] | 괄호 안의 문자를 포함하지 않은 문자열을 찾음 |
예제 1. 휴대폰 전화 번호 찾기 - (021111111 같은 지역번호와 섞여있는 경우)
select * from member where member_phone REGEXP '^010[0-9]{8}$';
예제 2. 경기도와 서울 전화 번호 찾기
select * from member where member_phone REGEXP '^(02|031)[0-9]{7,8}$';
예제 3. 이름이 1글자인 사람 찾기
select * from member where member_id REGEXP '^[0-9A-z]$';
예제 3에서 '.'만 하면 될 것 같지만 그러면 group_id 같이 다른 곳에서 한 글자인 것도 같이 검색된다. member_id만 정확하게 하고 싶다면 이렇게 하는 게 좋다.
예제 4. gmail을 사용하는 멤버 조회
select * from member where member_email REGEXP '(@gmail.com)$';
예제 5. naver를 사용하는 사람과 gmail을 사용하는 사람 각각 인원 조회(CASE절을 잘 몰라서 이건 gpt가 만들어줬다.)
SELECT
CASE WHEN member_email LIKE '%@gmail.com' THEN 'Gmail'
WHEN member_email LIKE '%@naver.com' THEN 'Naver'
ELSE 'Others'
END AS email_domain,
COUNT(*) AS count
FROM member
WHERE member_email IS NOT NULL
GROUP BY email_domain;
[ 참고 자료 ]
https://audgnssweet.tistory.com/65