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

> MySQL IN 연산자가 열 하나를 값 목록과 어떻게 비교하는지, NOT IN은 무엇이 다른지, 그리고 목록 어딘가에 NULL이 있으면 왜 NOT IN이 아무것도 반환하지 않는지 설명합니다.

> [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 →

`IN`은 열 하나를 여러 값과 한 번에 비교합니다. `OR`을 이어 쓴 것과 같은 뜻을 절 하나로 말하며, 필터의 값이 2개를 넘어가면 대부분의 사람이 손을 뻗는 절입니다.

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

## IN의 동작 방식

```sql theme={null}
SELECT COLUMN_LIST
FROM TABLE_NAME
WHERE COLUMN_NAME IN (FIRST_VALUE, SECOND_VALUE);
```

`COLUMN_NAME`을 검사할 열로, `FIRST_VALUE`와 `SECOND_VALUE`를 받아들일 값으로 바꾸세요.

조건은 열이 괄호 안의 어느 값과든 같을 때 참입니다. 값은 쉼표로 구분하고, 필요한 만큼 많이 쓰세요.

`x IN (a, b)`는 `x = a OR x = b`와 같은 뜻입니다. 더 읽기 좋은 쪽으로 쓰되, 값이 2개를 넘으면 `IN`이 더 읽기 좋습니다.

## 예제

### 여러 값 중 하나와 일치

```sql theme={null}
SELECT title, rating
FROM film
WHERE rating IN ('G', 'PG')
ORDER BY title
LIMIT 5;
```

```text theme={null}
+------------------+--------+
| title            | rating |
+------------------+--------+
| ACADEMY DINOSAUR | PG     |
| ACE GOLDFINGER   | G      |
| AFFAIR PREJUDICE | G      |
| AFRICAN EGG      | G      |
| AGENT TRUMAN     | PG     |
+------------------+--------+
5 rows in set (0.00 sec)
```

### 어느 것과도 일치하지 않음

```sql theme={null}
SELECT title, rating
FROM film
WHERE rating NOT IN ('G', 'PG')
ORDER BY title
LIMIT 5;
```

```text theme={null}
+------------------+--------+
| title            | rating |
+------------------+--------+
| ADAPTATION HOLES | NC-17  |
| AIRPLANE SIERRA  | PG-13  |
| AIRPORT POLLOCK  | R      |
| ALABAMA DEVIL    | PG-13  |
| ALADDIN CALENDAR | NC-17  |
+------------------+--------+
5 rows in set (0.00 sec)
```

### 숫자 목록

```sql theme={null}
SELECT first_name, last_name
FROM actor
WHERE actor_id IN (1, 5, 10)
ORDER BY actor_id;
```

```text theme={null}
+------------+--------------+
| first_name | last_name    |
+------------+--------------+
| PENELOPE   | GUINESS      |
| JOHNNY     | LOLLOBRIGIDA |
| CHRISTIAN  | GABLE        |
+------------+--------------+
3 rows in set (0.00 sec)
```

숫자에는 따옴표를 쓰지 않습니다. 행이 `actor_id` 순서로 돌아온 것은 `ORDER BY`가 그렇게 요청했기 때문이지, 목록이 그 순서라서가 아닙니다.

### 서버가 스스로 계산하는 목록

괄호 안에는 목록 대신 쿼리가 들어갈 수 있습니다. `film_actor`는 각 영화를 그 영화에 나오는 각 배우와 짝지은 테이블이므로, 여러분이 영화 id를 하나도 몰라도 이 쿼리는 배우 1이 출연한 영화를 요청합니다.

```sql theme={null}
SELECT title
FROM film
WHERE film_id IN (SELECT film_id FROM film_actor WHERE actor_id = 1)
ORDER BY title
LIMIT 5;
```

```text theme={null}
+-----------------------+
| title                 |
+-----------------------+
| ACADEMY DINOSAUR      |
| ANACONDA CONFESSIONS  |
| ANGELS LIFE           |
| BULWORTH COMMANDMENTS |
| CHEAPER CLYDE         |
+-----------------------+
5 rows in set (0.00 sec)
```

다른 쿼리 안에 쓴 쿼리가 서브쿼리입니다. 뒤의 섹션이 서브쿼리를 제대로 다룹니다. 여기서 하나를 미리 만나 둘 만한데, 대부분의 사람이 처음 서브쿼리를 쓰는 곳이 `IN` 목록이기 때문입니다.

## 목록의 NULL은 NOT IN을 망가뜨립니다

`IN`과 `NOT IN`은 목록의 NULL을 같은 방식으로 다루지 않고, 어느 쪽도 경고하지 않습니다.

`IN`에서는 목록의 NULL이 무해합니다. 실제 값과 일치하는 행은 그대로 남습니다.

```sql theme={null}
SELECT title, rating
FROM film
WHERE rating IN ('G', NULL)
ORDER BY title
LIMIT 3;
```

```text theme={null}
+------------------+--------+
| title            | rating |
+------------------+--------+
| ACE GOLDFINGER   | G      |
| AFFAIR PREJUDICE | G      |
| AFRICAN EGG      | G      |
+------------------+--------+
3 rows in set (0.00 sec)
```

`NOT IN`에서는 같은 목록이 아무것도 반환하지 않습니다.

```sql theme={null}
SELECT title, rating
FROM film
WHERE rating NOT IN ('G', NULL)
ORDER BY title
LIMIT 3;
```

```text theme={null}
Empty set (0.01 sec)
```

모든 영화에 등급이 있고 그중 822개는 `G` 등급이 아니므로, 빈 결과는 뜻밖입니다. 이유는 `NOT IN`이 열이 목록의 모든 값과 다른지 묻는데, 어떤 것도 NULL과 다르다고 보일 수 없기 때문입니다. 무엇이든 NULL과 비교하면 참이나 거짓이 아니라 NULL이 나오므로, 조건 전체가 결코 참이 되지 않고 어떤 행도 살아남지 못합니다.

이것은 목록이 서브쿼리일 때 가장 중요한데, 직접 손으로 쓰지 않은 서브쿼리는 예상하지 못한 NULL을 반환할 수 있기 때문입니다. 가능하다면 서브쿼리 안에 `WHERE COLUMN_NAME IS NOT NULL`을 추가하세요. [IS NULL](https://villagesql.com/docs/ko/tutorial/is-null.md) 수업이 NULL이 어떻게 비교되는지 다룹니다.

## 요약

* 열 하나를 값 목록과 절 하나로 비교하려면 `IN`을 사용하세요.
* `x IN (a, b)`는 `x = a OR x = b`로 읽으세요.
* 목록의 문자열은 따옴표로 감싸고 숫자는 그대로 두세요.
* 목록 자체가 하나의 답일 때는 괄호 안에 서브쿼리를 넣으세요.
* `NOT IN` 목록에는 NULL을 넣지 마세요. 어떤 행도 반환하지 않게 됩니다.

## 함께 보기

* [AND, OR, NOT](https://villagesql.com/docs/ko/tutorial/and-or-not.md) — IN이 대체하는 OR 연결
* [IS NULL](https://villagesql.com/docs/ko/tutorial/is-null.md) — NULL과의 비교가 참도 거짓도 아닌 이유
* [BETWEEN](https://villagesql.com/docs/ko/tutorial/between.md) — 목록이 아니라 범위 검사
* [서브쿼리](https://villagesql.com/docs/ko/tutorial/subqueries.md) — 예제 4에서 쓴 쿼리 형태


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