> ## 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 IS NULL

> MySQL에서 IS NULL과 IS NOT NULL로 NULL을 검사하는 방법, = NULL이 왜 언제나 아무것도 반환하지 않는지, 그리고 NULL 안전 동등 연산자가 대신 무엇을 하는지 설명합니다.

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

NULL은 값이 없다는 뜻입니다. 0이 아니고, 빈 문자열도 아닙니다. 이미 알고 있는 비교 연산자는 NULL을 볼 수 없으므로, NULL에는 자체 연산자가 필요합니다.

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

## IS NULL의 동작 방식

```sql theme={null}
SELECT COLUMN_LIST
FROM TABLE_NAME
WHERE COLUMN_NAME IS NULL;
```

`COLUMN_NAME`을 검사할 열로 바꾸세요.

`IS NULL`은 열에 값이 없을 때 참입니다. `IS NOT NULL`은 값이 있을 때 참입니다. 이 2개가 믿을 수 있는 유일한 검사이고, 그 이유는 밑바탕의 규칙입니다: NULL이 관련된 모든 비교는 NULL을 내는데, NULL은 참도 거짓도 아니므로 `WHERE`가 그 행을 버립니다.

## 예제

### 빠진 값 찾기

Sakila는 영화가 원래 만들어진 언어를 기록하는 열을 두고 있지만, 결코 채우지 않습니다.

```sql theme={null}
SELECT title, original_language_id
FROM film
ORDER BY title
LIMIT 3;
```

```text theme={null}
+------------------+----------------------+
| title            | original_language_id |
+------------------+----------------------+
| ACADEMY DINOSAUR |                 NULL |
| ACE GOLDFINGER   |                 NULL |
| ADAPTATION HOLES |                 NULL |
+------------------+----------------------+
3 rows in set (0.00 sec)
```

클라이언트는 값이 들어갈 자리에 `NULL`을 출력합니다.

```sql theme={null}
SELECT title FROM film WHERE original_language_id IS NULL ORDER BY title LIMIT 3;
```

```text theme={null}
+------------------+
| title            |
+------------------+
| ACADEMY DINOSAUR |
| ACE GOLDFINGER   |
| ADAPTATION HOLES |
+------------------+
3 rows in set (0.00 sec)
```

### 값이 있는 행 찾기

1,000개의 영화가 모두 그 열을 비워 두므로, 반대 검사는 아무것도 반환하지 않습니다.

```sql theme={null}
SELECT title FROM film WHERE original_language_id IS NOT NULL ORDER BY title;
```

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

### 가끔 빠져 있는 열

`address2`는 주소의 두 번째 줄입니다. Sakila에는 603개의 주소가 있고, 그중 4개는 두 번째 줄을 없음으로, 나머지 599개는 빈 문자열로 기록합니다.

```sql theme={null}
SELECT address_id, address, address2
FROM address
WHERE address2 IS NULL
ORDER BY address_id;
```

```text theme={null}
+------------+----------------------+----------+
| address_id | address              | address2 |
+------------+----------------------+----------+
|          1 | 47 MySakila Drive    | NULL     |
|          2 | 28 MySQL Boulevard   | NULL     |
|          3 | 23 Workhaven Lane    | NULL     |
|          4 | 1411 Lillydale Drive | NULL     |
+------------+----------------------+----------+
4 rows in set (0.00 sec)
```

## 없는 값과 빈 값은 다릅니다

603개의 주소 중 4개만 두 번째 줄이 기록되지 않았습니다. 나머지 599개는 빈 문자열을 가지고 있는데, 그것은 값입니다: 누군가 일부러 거기에 아무것도 쓰지 않은 것입니다.

```sql theme={null}
SELECT address_id, address2
FROM address
WHERE address2 = ''
ORDER BY address_id
LIMIT 3;
```

```text theme={null}
+------------+----------+
| address_id | address2 |
+------------+----------+
|          5 |          |
|          6 |          |
|          7 |          |
+------------+----------+
3 rows in set (0.00 sec)
```

클라이언트는 없는 값에는 `NULL`을 출력하고 빈 문자열에는 아무것도 출력하지 않으므로, 둘은 화면에서는 거의 같아 보이고 쿼리에서는 전혀 다르게 동작합니다. `IS NULL`은 처음 4개의 행을 찾고 `= ''`는 나머지 599개를 찾습니다. 어느 검사도 둘 다 찾지 못하므로, 둘이 섞인 열에서 모든 빈칸을 잡으려면 `address2 IS NULL OR address2 = ''`가 필요합니다.

## = NULL은 결코 아무것과도 일치하지 않습니다

모든 영화의 `original_language_id`가 NULL이므로, 이 쿼리는 1,000개의 행을 반환할 것처럼 보입니다.

```sql theme={null}
SELECT title FROM film WHERE original_language_id = NULL ORDER BY title;
```

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

행도 없고, 오류도 없고, 경고도 없습니다. `=`는 2개의 값이 같은지 묻는데, NULL은 값이 아니므로 답은 예도 아니오도 아닙니다. 답은 NULL이고, `WHERE`는 조건이 참인 행만 남깁니다.

같은 함정이 `<> NULL`도 잡는데, 이것도 아무것과도 일치하지 않습니다. `IS NULL`과 `IS NOT NULL`이 이 일을 위해 만들어진 연산자입니다.

연산자 하나가 이 규칙을 벗어납니다. `<=>`는 NULL 안전 동등 연산자입니다: 언제나 1 또는 0으로 답하고, 2개의 NULL을 같은 것으로 칩니다. 둘 다 값이 없을 수 있는 2개의 열을 비교하면서 그 경우를 일치로 치고 싶을 때 쓰세요. [연산자](https://villagesql.com/docs/ko/tutorial/operators.md) 수업에서는 `<=>`를 그것이 대체하는 비교 연산자들 옆에서 보여줍니다.

## 요약

* 없는 값을 검사하려면 `IS NULL`과 `IS NOT NULL`을 사용하세요.
* `= NULL`이나 `<> NULL`은 결코 쓰지 마세요. 둘 다 어떤 행과도 일치하지 않고 아무 말도 하지 않습니다.
* NULL과의 모든 비교는 NULL을 내고, `WHERE`는 그것을 참이 아닌 것으로 다룹니다.
* 2개의 NULL을 같은 것으로 쳐야 할 때는 `<=>`를 사용하세요.
* `IS NULL`은 빈 문자열을 찾지 못하므로, 빈 문자열은 따로 검사하세요.

## 함께 보기

* [WHERE](https://villagesql.com/docs/ko/tutorial/where.md) — 이 검사들이 들어가는 절
* [연산자](https://villagesql.com/docs/ko/tutorial/operators.md) — 다른 연산자에 대해 NULL이 동작하는 방식
* [IN](https://villagesql.com/docs/ko/tutorial/in.md) — `NOT IN` 목록의 NULL이 어떤 행도 반환하지 않는 이유
* [MySQL의 NULL](https://villagesql.com/docs/ko/guides/null-in-mysql.md) — 조인, 집계, 인덱스, 제약 조건에서의 NULL


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