> ## 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 が見えないからです。

始める前に `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 になり、それは真でも偽でも
ないので、`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` は住所の 2 行目です。Sakila には 603 件の住所があり、そのうち 4 件
では 2 行目を欠落として、残りの 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 件の住所のうち、2 行目が記録されていないのは 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` と表示し、空文字列には何も表示しない
ので、画面上では 2 つはほとんど同じに見えますが、クエリでの振る舞いは
まったく異なります。`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` が、この仕事のために作られた演算子です。

1 つの演算子だけがこのルールを免れます。`<=>` は NULL 安全等価です。常に
1 か 0 を返し、2 つの NULL を等しいとみなします。両方とも欠けている可能性の
ある 2 つの列を比較し、それを一致として数えたいときに使ってください。
[演算子](https://villagesql.com/docs/ja/tutorial/operators.md)のレッスンでは、それが置き換える比較演算子と
並べて示しています。

## まとめ

* 欠けている値をテストするには `IS NULL` と `IS NOT NULL` を使います。
* `= NULL` や `<> NULL` は決して書かないでください。どちらもどの行にも一致せず、エラーも警告も出しません。
* NULL とのあらゆる比較は NULL になり、`WHERE` はそれを真でないものとして扱います。
* 2 つの NULL を等しいとみなすべきときは `<=>` を使います。
* 空文字列は別にテストしてください。`IS NULL` は空文字列を見つけません。

## 関連項目

* [WHERE](https://villagesql.com/docs/ja/tutorial/where.md) — これらのテストを置く句
* [演算子](https://villagesql.com/docs/ja/tutorial/operators.md) — 他の演算子に対する NULL の振る舞い
* [IN](https://villagesql.com/docs/ja/tutorial/in.md) — `NOT IN` のリスト内の NULL が行を返さない理由
* [MySQL における NULL](https://villagesql.com/docs/ja/guides/null-in-mysql.md) — 結合、集計、インデックス、制約における NULL


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