NULL
値の概念については、NULL
が空の文字列 ''
と同じであると考えがちな SQL の初心者が混乱することがよくあります。これらは同一ではありません。たとえば、次の 2 つのステートメントは完全に異なります。
mysql> INSERT INTO my_table (phone) VALUES (NULL);
mysql> INSERT INTO my_table (phone) VALUES ('');
両方のステートメントで phone
カラムに値が挿入されていますが、最初のステートメントは NULL
値を挿入しており、2 番目のステートメントは空の文字列を挿入しています。最初のステートメントの意味は「電話番号がわからない」、2 番目のステートメントの意味は「この人は電話を持っていないため、電話番号がない」と見なすことができます。
NULL
を処理する場合は、IS NULL
演算子と IS NOT NULL
演算子、および IFNULL()
関数を使用できます。
SQL では、NULL
値はほかの値 (NULL
を含む) との比較で true になることはありません。NULL
を含む式は、式に関連する演算子および関数のドキュメントに示されている場合を除き、常に NULL
値を生成します。次の例のすべてのカラムは NULL
を返します。
mysql> SELECT NULL, 1+NULL, CONCAT('Invisible',NULL);
NULL
であるカラム値を検索する場合、expr = NULL
テストは使用できません。expr = NULL
はどのような式の場合でも true にならないため、次のステートメントは行を返しません。
mysql> SELECT * FROM my_table WHERE phone = NULL;
NULL
値を検索するには、IS NULL
テストを使用する必要があります。次のステートメントは、NULL
の電話番号および空の電話番号を検索する方法を示しています。
mysql> SELECT * FROM my_table WHERE phone IS NULL;
mysql> SELECT * FROM my_table WHERE phone = '';
追加情報および例については、セクション3.3.4.6「NULL 値の操作」を参照してください。
MyISAM
、InnoDB
、または MEMORY
ストレージエンジンを使用している場合は、NULL
値を持つことができるカラムにインデックスを追加できます。それ以外の場合は、インデックスが付けられるカラムを NOT NULL
と宣言する必要があり、そのカラムには NULL
を挿入できません。
LOAD DATA INFILE
でデータが読み取られるときに、空のカラムまたは欠落しているカラムは ''
で更新されます。NULL
値をカラムにロードするには、データファイルで \N
を使用します。状況によっては、リテラル文字 「NULL
」 も使用できます。セクション13.2.6「LOAD DATA INFILE 構文」を参照してください。
DISTINCT
、GROUP BY
、または ORDER BY
が使用された場合、すべての NULL
値は等しいと見なされます。
ORDER BY
を使用した場合、NULL
値は最初 (DESC
を指定してソートを降順にした場合は最後) に表示されます。
集約 (サマリー) 関数 (COUNT()
、MIN()
、SUM()
など) は NULL
値を無視します。例外は個別のカラム値ではなく行数をカウントする COUNT(*)
です。たとえば、次のステートメントは 2 つのカウントを生成します。最初のカウントはテーブル内の行数のカウントであり、2 番目のカウントは age
カラムの NULL
以外の値の数のカウントです。
mysql> SELECT COUNT(*), COUNT(age) FROM person;
一部のデータ型では、MySQL は NULL
値に対して特殊な処理を行います。NULL
を TIMESTAMP
カラムに挿入すると、現在の日付と時間が挿入されます。NULL
を AUTO_INCREMENT
属性を持つ整数カラムまたは浮動小数点カラムに挿入すると、シーケンスの次の数値が挿入されます。