VillageSQL is a drop-in replacement for MySQL with extensions.
All examples on this page work on VillageSQL. Install Now →
mysql -u root -p sakila でクライアントを開いてください。
IS NULL の仕組み
COLUMN_NAME をテストする列に置き換えます。
IS NULL は列が値を持たないときに真になります。IS NOT NULL は値を持つときに
真になります。信頼できるテストはこの 2 つだけであり、その理由は根底にある
ルールにあります。NULL を含むあらゆる比較は NULL になり、それは真でも偽でも
ないので、WHERE はその行を除外します。
例
- 欠けている値を見つける
Sakila には映画が元々制作された言語を記録する列がありますが、一度も埋められて
いません。
NULL と表示します。
- 値を持つ行を見つける
1,000 本すべての映画がその列を空のままにしているので、逆のテストは何も
返しません。
- ときどき欠けている列
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