> ## Documentation Index
> Fetch the complete documentation index at: https://villagesql.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# MySQL LIKE

> MySQL LIKE 연산자가 %와 _로 패턴을 어떻게 일치시키는지, 그 문자들을 문자 그대로 일치시키는 방법, 그리고 LIKE가 기본적으로 대소문자를 무시하는 이유를 설명합니다.

> [card] [VillageSQL is a drop-in replacement for MySQL with extensions.](https://villagesql.com/docs/en/8.4/stable/install-server.md)
>
> All examples on this page work on VillageSQL. Install Now →

`=`는 값 전체를 일치시킵니다. `LIKE`는 패턴을 일치시키므로, 어떤 단어로 시작하거나 끝나는 제목, 또는 주어진 모양을 가진 제목을 요청할 수 있습니다.

시작하기 전에 `mysql -u root -p sakila`로 클라이언트를 여세요.

## LIKE의 동작 방식

```sql theme={null}
SELECT COLUMN_LIST
FROM TABLE_NAME
WHERE COLUMN_NAME LIKE 'PATTERN_TEXT';
```

`PATTERN_TEXT`를 일치시킬 패턴으로 바꾸세요. 패턴은 보통의 텍스트에 2개의 특수 문자를 더한 것입니다:

| 문자 | 일치 대상 |
| - | - |
| `%` | 아무 문자의 연속, 0개도 포함 |
| `_` | 정확히 1개의 문자 |

패턴의 나머지는 모두 자기 자신과 일치합니다. `%`도 `_`도 없는 패턴은 `=`와 거의 같게 동작합니다. 둘은 끝의 공백에서 갈립니다: `utf8mb4_general_ci` 같은 `PAD SPACE` 콜레이션에서는 `'a ' = 'a'`가 참이고 `'a ' LIKE 'a'`는 거짓입니다. 모든 `utf8mb4_0900` 콜레이션이 그렇듯 `NO PAD` 콜레이션에서는 둘 다 거짓입니다.

## 예제

### \~로 시작

```sql theme={null}
SELECT title FROM film WHERE title LIKE 'ACADEMY%' ORDER BY title;
```

```text theme={null}
+------------------+
| title            |
+------------------+
| ACADEMY DINOSAUR |
+------------------+
1 row in set (0.00 sec)
```

### \~로 끝남

```sql theme={null}
SELECT title FROM film WHERE title LIKE '%GOLDFINGER' ORDER BY title;
```

```text theme={null}
+----------------------+
| title                |
+----------------------+
| ACE GOLDFINGER       |
| BREAKFAST GOLDFINGER |
| SILVERADO GOLDFINGER |
+----------------------+
3 rows in set (0.00 sec)
```

### 고정된 문자 수

`J` 뒤의 밑줄 3개는 정확히 4글자인 이름을 요청합니다.

```sql theme={null}
SELECT first_name, last_name
FROM actor
WHERE first_name LIKE 'J___'
ORDER BY first_name, last_name;
```

```text theme={null}
+------------+-------------+
| first_name | last_name   |
+------------+-------------+
| JADA       | RYDER       |
| JANE       | JACKMAN     |
| JEFF       | SILVERSTONE |
| JOHN       | SUVARI      |
| JUDE       | CRUISE      |
| JUDY       | DEAN        |
+------------+-------------+
6 rows in set (0.00 sec)
```

`JOHNNY`는 목록에 없는데, `J___`는 4글자와 일치하고 그 이상은 아니기 때문입니다.

### 일치하지 않음

```sql theme={null}
SELECT title FROM film WHERE title NOT LIKE 'A%' ORDER BY title LIMIT 5;
```

```text theme={null}
+---------------------+
| title               |
+---------------------+
| BABY HALL           |
| BACKLASH UNDEFEATED |
| BADMAN DAWN         |
| BAKED CLEOPATRA     |
| BALLOON HOMEWARD    |
+---------------------+
5 rows in set (0.00 sec)
```

## 여기서 LIKE는 대소문자를 무시합니다

같은 패턴을 소문자로 써도 같은 행이 돌아옵니다.

```sql theme={null}
SELECT title FROM film WHERE title LIKE 'academy%' ORDER BY title;
```

```text theme={null}
+------------------+
| title            |
+------------------+
| ACADEMY DINOSAUR |
+------------------+
1 row in set (0.00 sec)
```

이것은 `LIKE`에 관한 규칙이 아닙니다. 열에 관한 규칙으로, 열의 콜레이션이 2개의 문자열을 같은 것으로 칠지 결정합니다. Sakila의 콜레이션은 대소문자를 구분하지 않고, MySQL 기본값도 그렇습니다. [대소문자 구분](https://villagesql.com/docs/ko/tutorial/case-sensitivity.md) 수업이 열을 확인하는 방법과 대소문자를 구분하는 일치를 요청하는 방법을 보여줍니다.

## 문자 그대로의 % 또는 \_ 일치시키기

검색 텍스트의 `%`는 달리 말하지 않는 한 와일드카드입니다. `ESCAPE`는 바로 뒤의 문자를 끄는 문자를 지정하므로, 패턴이 진짜 퍼센트 기호를 요청할 수 있습니다.

```sql theme={null}
SELECT 'axxb' LIKE 'a%b' AS wildcard, 'axxb' LIKE 'a!%b' ESCAPE '!' AS literal_percent;
```

```text theme={null}
+----------+-----------------+
| wildcard | literal_percent |
+----------+-----------------+
|        1 |               0 |
+----------+-----------------+
1 row in set (0.00 sec)
```

`a%b`는 `%`가 `xx`를 대신했으므로 `axxb`와 일치했습니다. `a!%b`는 `a`와 `b` 사이의 문자 그대로의 퍼센트 기호를 요청했는데, `axxb`에는 그것이 없습니다.

```sql theme={null}
SELECT '50%' LIKE '50!%' ESCAPE '!' AS literal_percent;
```

```text theme={null}
+-----------------+
| literal_percent |
+-----------------+
|               1 |
+-----------------+
1 row in set (0.00 sec)
```

밑줄도 같은 방식으로 동작합니다.

```sql theme={null}
SELECT 'a_b' LIKE 'a!_b' ESCAPE '!' AS underscore, 'axb' LIKE 'a!_b' ESCAPE '!' AS any_char;
```

```text theme={null}
+------------+----------+
| underscore | any_char |
+------------+----------+
|          1 |        0 |
+------------+----------+
1 row in set (0.00 sec)
```

데이터에 들어 있지 않다고 확신하는 문자라면 무엇이든 됩니다. `ESCAPE`가 없으면 역슬래시가 다음 문자를 이스케이프하므로, `'a\%b'`도 같은 뜻입니다. 그 지름길은 서버의 `sql_mode`에 `NO_BACKSLASH_ESCAPES`가 있으면 동작을 멈추고, `ESCAPE`는 어느 쪽이든 동작합니다.

## 앞에 오는 %가 비싼 쪽입니다

`LIKE 'ACADEMY%'`는 열의 인덱스를 사용할 수 있는데, 모든 일치가 같은 알려진 텍스트로 시작하고 인덱스는 정렬된 순서로 보관되므로, 서버가 그 부분으로 바로 건너뛰기 때문입니다. `LIKE '%GOLDFINGER'`는 일치가 어디서든 시작할 수 있어 출발점을 주지 못하므로, 서버는 열의 모든 값을 읽고 하나씩 검사합니다. 2개의 쿼리에 `EXPLAIN`을 실행하면 차이가 보입니다: 추정 행 1개 대 1,000개.

1,000개의 영화에서는 아무도 알아채지 못합니다. 큰 테이블에서는 조회와 전체 스캔의 차이입니다. 대규모로 텍스트 안을 검색해야 할 때는 다른 도구가 맞습니다: [MySQL의 전문 검색](https://villagesql.com/docs/ko/guides/full-text-search.md)을 보세요.

## 요약

* 값 전체가 아니라 패턴을 일치시키려면 `LIKE`를 사용하세요.
* `%`는 아무 문자의 연속으로, `_`는 정확히 1개의 문자로 읽으세요.
* 문자 그대로의 `%`나 `_`를 일치시키려면 `ESCAPE`로 이스케이프 문자를 지정하세요.
* 대소문자가 중요한지는 `LIKE`가 아니라 열의 콜레이션이 결정합니다.
* 큰 테이블에서는 앞에 오는 `%`를 피하세요. 어떤 인덱스도 검색 범위를 좁힐 수 없습니다.

## 함께 보기

* [REGEXP](https://villagesql.com/docs/ko/tutorial/regexp.md) — `%`와 `_`로 나타낼 수 없는 패턴
* [대소문자 구분](https://villagesql.com/docs/ko/tutorial/case-sensitivity.md) — 소문자 패턴이 일치한 이유
* [MySQL 문자열 함수](https://villagesql.com/docs/ko/guides/string-functions.md) — 비교하기 전에 텍스트 다듬기
* [MySQL의 전문 검색](https://villagesql.com/docs/ko/guides/full-text-search.md) — 대규모로 텍스트 안 검색하기


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.