メインコンテンツへスキップ

VillageSQL is a drop-in replacement for MySQL with extensions.

All examples on this page work on VillageSQL. Install Now →
NULL は値がそこにないことを意味します。0 ではなく、空文字列でもありません。 専用の演算子が必要です。既に知っている比較演算子には NULL が見えないからです。 始める前に mysql -u root -p sakila でクライアントを開いてください。

IS NULL の仕組み

COLUMN_NAME をテストする列に置き換えます。 IS NULL は列が値を持たないときに真になります。IS NOT NULL は値を持つときに 真になります。信頼できるテストはこの 2 つだけであり、その理由は根底にある ルールにあります。NULL を含むあらゆる比較は NULL になり、それは真でも偽でも ないので、WHERE はその行を除外します。

例

  1. 欠けている値を見つける

Sakila には映画が元々制作された言語を記録する列がありますが、一度も埋められて いません。
クライアントは値が入る場所に NULL と表示します。

  1. 値を持つ行を見つける

1,000 本すべての映画がその列を空のままにしているので、逆のテストは何も 返しません。

  1. ときどき欠けている列

address2 は住所の 2 行目です。Sakila には 603 件の住所があり、そのうち 4 件 では 2 行目を欠落として、残りの 599 件では空文字列として記録しています。

欠けている値と空の値は別物

603 件の住所のうち、2 行目が記録されていないのは 4 件だけです。残りの 599 件は 空文字列を持っており、これは値です。誰かが意図的にそこに何も書かなかったの です。
クライアントは欠けている値には NULL と表示し、空文字列には何も表示しない ので、画面上では 2 つはほとんど同じに見えますが、クエリでの振る舞いは まったく異なります。IS NULL は最初の 4 行を見つけ、= '' は残りの 599 行を 見つけます。どちらのテストも両方は見つけないので、両者が混在する列ですべての 空欄を捕まえるには address2 IS NULL OR address2 = '' が必要です。

= NULL は決して何にも一致しない

すべての映画の original_language_id は NULL なので、これは 1,000 行を返す ように見えます。
行なし、エラーなし、警告なしです。= は 2 つの値が同じかどうかを問いますが、 NULL は値ではないので、答えは「はい」でも「いいえ」でもありません。答えは NULL であり、WHERE は条件が真である行だけを残します。 同じ罠は <> NULL にも当てはまり、これも何にも一致しません。IS NULL と IS NOT NULL が、この仕事のために作られた演算子です。 1 つの演算子だけがこのルールを免れます。<=> は NULL 安全等価です。常に 1 か 0 を返し、2 つの NULL を等しいとみなします。両方とも欠けている可能性の ある 2 つの列を比較し、それを一致として数えたいときに使ってください。 演算子のレッスンでは、それが置き換える比較演算子と 並べて示しています。

まとめ

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

関連項目

  • WHERE — これらのテストを置く句
  • 演算子 — 他の演算子に対する NULL の振る舞い
  • IN — NOT IN のリスト内の NULL が行を返さない理由
  • MySQL における NULL — 結合、集計、インデックス、制約における NULL