NULL
値に慣れるまでは、その動作は意外に見えるかもしれません。概念的には、NULL
は「存在しない不明な値」を意味し、ほかの値とは多少異なる方法で扱われます。NULL
の検査には、=
、<
、<>
などの算術比較演算子は使用できません。これを自分で確認するために、次のクエリーを実行してみてください。
mysql> SELECT 1 = NULL, 1 <> NULL, 1 < NULL, 1 > NULL;
+----------+-----------+----------+----------+
| 1 = NULL | 1 <> NULL | 1 < NULL | 1 > NULL |
+----------+-----------+----------+----------+
| NULL | NULL | NULL | NULL |
+----------+-----------+----------+----------+
当然、これらの比較から意味のある結果は得られません。代わりに、IS
NULL
演算子と
IS NOT NULL
演算子を使用します。
mysql> SELECT 1 IS NULL, 1 IS NOT NULL;
+-----------+---------------+
| 1 IS NULL | 1 IS NOT NULL |
+-----------+---------------+
| 0 | 1 |
+-----------+---------------+
MySQL では、0
や
NULL
は false
を意味し、それ以外はすべて true
を意味します。ブール演算のデフォルトの真理値は
1
です。
NULL
はこのように特殊に扱われるため、前の節でペットが死んでいるかどうかを調べるときにも
death <> NULL
ではなく death IS NOT
NULL
を使用する必要がありました。
GROUP BY
では、2 つの
NULL
値は等しいと見なされます。
ORDER BY
を実行する場合、NULL
値は ORDER BY ... ASC
では最初に表示され、ORDER
BY ... DESC
では最後に表示されます。
NULL
を操作するときによくある間違いは、NOT
NULL
と定義されたカラムにはゼロや空の文字列は挿入できないと想定することです。これらは実際に値であるのに対し、NULL
は「値がない」ことを意味します。これは、次のように
IS
[NOT
]
NULL
を使用して簡単にテストできます。
mysql> SELECT 0 IS NULL, 0 IS NOT NULL, '' IS NULL, '' IS NOT NULL;
+-----------+---------------+------------+----------------+
| 0 IS NULL | 0 IS NOT NULL | '' IS NULL | '' IS NOT NULL |
+-----------+---------------+------------+----------------+
| 0 | 1 | 0 | 1 |
+-----------+---------------+------------+----------------+
このように、ゼロや空の文字列は実際に
NOT NULL
なので、NOT NULL
カラムに挿入することができます。Problems with NULL
Values
を参照してください。