IT무새/Database

[MySQL] LIKE 연산자

코딩무새 2025. 2. 9. 00:49

껄껄껄

코딩무새입니다.


 

LIKE에 대해서 알아보겠습니다.

LIKE는 정말 유용한데요.

유용한 만큼 잘못 사용하면 성능에 문제를 일으킬 수 있죠.

 

LIKE?

MySQL의 LIKE 연산자는 부분 일치, 패턴 검색을 수행할 때 자주 사용됩니다.

주로 WHERE과 함께 사용되죠.

 

기본문법

기본 문법은 다음과 같습니다.

SELECT . . .
FROM {TABLE_NAME}
WHERE {COLUMN1} LIKE 'Parr%';


SELECT . . .
FROM {TABLE_NAME}
WHERE {COLUMN1} LIKE 'P___ot';

 

Parrot이라는 데이터를 찾으려는 LIKE 기본문법 쿼리입니다.

예제 쿼리가 두 개군요?!

그렇습니다.

 

LIKE는 두 가지 와일드카드를 사용할 수 있죠.

 

'%'

  • 0개 이상의 문자를 대체합니다.
  • LIKE 'Parr%'에서 r 뒤의 모든 문자를 대체하여 찾는 조건입니다.
  • ex. Parrot, Parr123, ParrTester...

'_'

  • 정확히 1개의 문자를 대체합니다.
  • LIKE 'P___ot'에서는 _사용이 세 번 되었으니, 3개의 문자열을 대체하는 패턴으로 데이터를 가져옵니다.
  • ex. Parrot, P123ot, Ptesot...

 

예제 쿼리

그럼 실제 데이터로 확인해 보겠습니다.

아래는 username 데이터입니다.

SELECT username 
FROM users;
+----------+
| username |
+----------+
| parrot   |
| test1    |
| test2    |
| test3    |
| apt      |
| bear     |
| zip      |
+----------+
7 rows in set (0.00 sec)

 

LIKE를 사용해 볼게요~

먼저 '%'를 사용한 예제쿼리입니다.

SELECT username FROM users WHERE username LIKE 'te%';
+----------+
| username |
+----------+
| test1    |
| test2    |
| test3    |
+----------+
3 rows in set (0.00 sec)


SELECT username FROM users WHERE username LIKE '%t';
+----------+
| username |
+----------+
| parrot   |
| apt      |
+----------+
2 rows in set (0.00 sec)


SELECT username FROM users WHERE username LIKE '%es%';
+----------+
| username |
+----------+
| test1    |
| test2    |
| test3    |
+----------+
3 rows in set (0.00 sec)

 

첫 번째 쿼리에 te로 시작하는 username을 조회했습니다.

두 번째  쿼리는 t로 끝나는 username을 가져왔네요.

마지막 쿼리는 es가 포함된 username을 줍줍 했어요.

 

차이가 보이시나요!?

 

다음은 '_'를 활용해 볼게요.

SELECT username FROM users WHERE username LIKE 'a__';
+----------+
| username |
+----------+
| apt      |
+----------+
1 row in set (0.00 sec)


SELECT username FROM users WHERE username LIKE 't_s__';
+----------+
| username |
+----------+
| test1    |
| test2    |
| test3    |
+----------+
3 rows in set (0.00 sec)


SELECT username FROM users WHERE username LIKE '___';
+----------+
| username |
+----------+
| apt      |
| zip      |
+----------+
2 rows in set (0.00 sec)

 

첫 번째 쿼리는 a 이후 두 자리를 대체하는 username을 조회했어요.

두 번째 쿼리는 t 다음 한자리 s 다음 두 자리 문자를 대체하는 username을 가져왔네요.

마지막 쿼리는 세 글자인 username을 줍줍 했습니다.

 

NOT LIKE

LIKE의 활용을 반대로 할 수도 있습니다.

바로 NOT을 사용할 수 있죠.

SELECT username FROM users WHERE username NOT LIKE '___';
+----------+
| username |
+----------+
| parrot   |
| test1    |
| test2    |
| test3    |
| bear     |
| timo     |
| nula     |
+----------+
7 rows in set (0.00 sec)


mysql> SELECT username FROM users WHERE username NOT LIKE 'Parr%';
+----------+
| username |
+----------+
| test1    |
| test2    |
| test3    |
| apt      |
| bear     |
| zip      |
| timo     |
| nula     |
+----------+
8 rows in set (0.00 sec)

 

첫 번째 쿼리는 세 글자가 아닌 데이터가 나왔고, 두 번째 쿼리는 Parr로 시작하지 않는 username을 검색해 왔습니다.

 

사용 시 유의할 점

LIKE는 유용하지만 잘 못 사용하면 성능 저하를 일으킬 수도 있습니다.

특히 인덱스 활용여부에 따라서 성능이 크게 떨어질 수 있는데요.

 

LIKE 연산자의 패턴에 따라 인덱스 사용 여부가 달라집니다

  • LIKE 'keyword%'인덱스 사용
  • LIKE '%keyword'인덱스 미사용
  • LIKE '%keyword%'인덱스 미사용

이런 성능이슈를 해결하는 방법으론 FULLTEXT 인덱스 활용 같은 방법이 있겠네요.

 


 

LIKE에 대해서 쓰다 보니 뭔가 길게 쓴 거 같네요.

길게 쓰니 좋군요.

껄껄껄

'IT무새 > Database' 카테고리의 다른 글

[MySQL] HAVING  (0) 2025.03.25
[MySQL] 데이터 그룹화 | GROUP BY  (2) 2025.03.09
[MySQL] IN 연산자  (3) 2025.02.06
[MySQL] Mysql에 CSV 데이터 Import | HeidiSQL  (2) 2025.02.01
[MySQL] 쿼리 조건 | WHERE Clause  (2) 2025.02.01