MySQL - like와 REGEXP

2024. 3. 1. 01:46데이터베이스 & SQL/SQL - MySQL

[ 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

https://velog.io/@gillog/MySQL-REGEXPRegular-Expression%EC%A0%95%EA%B7%9C-%ED%91%9C%ED%98%84%EC%8B%9D

 

 

'데이터베이스 & SQL > SQL - MySQL' 카테고리의 다른 글

SQL 기초 - Select문(싱글테이블)  (0) 2024.03.01