> ## 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 REGEXP

> MySQL에서 REGEXP, RLIKE, REGEXP_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`는 2개의 문자로 형태를 설명합니다. `REGEXP`는 패턴 언어 전체로 형태를 설명하므로, `LIKE`가 표현할 수 없는 것을 요구할 수 있습니다: 여러 대안 중 하나, 반복되는 그룹, 문자 범위입니다.

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

## REGEXP의 동작 방식

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

`PATTERN_TEXT`를 찾을 정규식으로 바꾸세요.

조건은 패턴이 값 안의 어디에서든 일치하면 참입니다. 그것이 값 전체를 설명해야 하는 `LIKE`와의 첫 번째 차이입니다.

아래에서 사용하는 조각들:

| 조각 | 의미 |
| - | - |
| `^` | 값의 시작 |
| `$` | 값의 끝 |
| `.` | 임의의 문자 1개 |
| `*` | 앞의 것이 몇 번이든 반복 |
| `[AB]` | 대괄호 안의 문자 중 1개 |
| `(AL\|BE)` | 둘 중 하나의 대안 |

## 예제

### 다음으로 시작

```sql theme={null}
SELECT title FROM film WHERE title REGEXP '^ACA' ORDER BY title;
```

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

`^`가 없으면 패턴은 제목 안의 어디에 있는 `ACA`와도 일치합니다.

### 다음으로 끝남

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

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

### 2가지 시작 중 하나

```sql theme={null}
SELECT first_name FROM actor WHERE first_name REGEXP '^(AL|BE)' ORDER BY first_name LIMIT 5;
```

```text theme={null}
+------------+
| first_name |
+------------+
| AL         |
| ALAN       |
| ALBERT     |
| ALBERT     |
| ALEC       |
+------------+
5 rows in set (0.00 sec)
```

`ALBERT`가 두 번 나오는 것은 2명의 배우가 같은 이름을 쓰기 때문입니다. `SELECT`는 고유한 값이 아니라 행을 보고합니다.

### LIKE가 설명할 수 없는 형태

이 쿼리는 `A`나 `B`로 시작하고 `S`로 끝나는 제목을 요구합니다.

```sql theme={null}
SELECT title FROM film WHERE title REGEXP '^[AB].*S$' ORDER BY title LIMIT 5;
```

```text theme={null}
+----------------------+
| title                |
+----------------------+
| ADAPTATION HOLES     |
| AMELIE HELLFIGHTERS  |
| AMERICAN CIRCUS      |
| ANACONDA CONFESSIONS |
| ANALYZE HOOSIERS     |
+----------------------+
5 rows in set (0.00 sec)
```

### 일치하지 않는 모든 것

`NOT REGEXP`는 `NOT LIKE`와 같은 방식으로 검사를 뒤집습니다.

```sql theme={null}
SELECT title, rating
FROM film
WHERE title NOT REGEXP '^A'
ORDER BY title
LIMIT 5;
```

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

NULL 값은 `REGEXP`에도 `NOT REGEXP`에도 일치하지 않는데, 둘 다 NULL에 대해 NULL을 반환하기 때문입니다. [IS NULL](https://villagesql.com/docs/ko/tutorial/is-null.md)이 그것을 다룹니다.

## RLIKE는 같은 연산자입니다

```sql theme={null}
SELECT title FROM film WHERE title RLIKE '^ACA' ORDER BY title;
```

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

`RLIKE`와 `REGEXP`는 하나의 연산자를 쓰는 2가지 표기입니다. 하나를 골라서 계속 쓰세요.

## 대소문자 구분, 그리고 그것을 강제하는 방법

패턴은 `LIKE`와 마찬가지로 일치시키는 대상의 콜레이션을 따릅니다. 따라서 기본적으로 소문자 패턴이 대문자 텍스트와 일치합니다. `REGEXP_LIKE()`는 이 연산자의 함수 형태이고, 세 번째 인수가 그것을 재정의합니다: `'c'`는 대소문자 구분을 뜻합니다.

```sql theme={null}
SELECT REGEXP_LIKE('ACADEMY DINOSAUR', '^aca') AS default_mode,
       REGEXP_LIKE('ACADEMY DINOSAUR', '^aca', 'c') AS case_sensitive;
```

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

## LIKE로 표현할 수 있으면 LIKE를 쓰세요

어떤 인덱스도 `REGEXP` 검색의 범위를 좁힐 수 없는데, 일치가 어디에서든 시작할 수 있어서 서버가 모든 값을 검사하기 때문입니다. 고정된 텍스트로 시작하는 패턴을 쓴 `LIKE`는 인덱스에서 일치하는 부분으로 곧바로 건너뛸 수 있습니다. 둘 다 필터를 표현할 수 있을 때는 `LIKE`가 둘 중 더 저렴합니다. [LIKE](https://villagesql.com/docs/ko/tutorial/like.md) 레슨이 어떤 패턴이 인덱스를 쓸 수 있고 어떤 패턴이 쓸 수 없는지 설명합니다.

## 요약

* 값 안의 어디에서든 패턴을 일치시키려면 `REGEXP`를 쓰세요.
* 일치가 시작이나 끝에 있어야 할 때는 `^`와 `$`로 고정하세요.
* `RLIKE`는 `REGEXP`의 다른 이름으로 읽으세요.
* 대소문자를 구분하는 일치를 강제하려면 `REGEXP_LIKE(value, pattern, 'c')`를 쓰세요.
* 먼저 `LIKE`를 쓰세요. 어떤 인덱스도 `REGEXP` 검색의 범위를 좁힐 수 없기 때문입니다.

## 함께 보기

* [LIKE](https://villagesql.com/docs/ko/tutorial/like.md) — 더 단순한 패턴 연산자
* [대소문자 구분](https://villagesql.com/docs/ko/tutorial/case-sensitivity.md) — 기본 동작을 결정하는 것
* [WHERE](https://villagesql.com/docs/ko/tutorial/where.md) — 패턴이 들어가는 절
* [MySQL의 전문 검색](https://villagesql.com/docs/ko/guides/full-text-search.md) — 대규모 텍스트에서 단어 검색하기
* [MySQL의 퍼지 문자열 매칭](https://villagesql.com/docs/ko/guides/fuzzy-string-matching.md) — 같지는 않지만 비슷한 텍스트 일치시키기


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