MySQL 8.0 リファレンスマニュアル


B.3.4.3 NULL 値に関する問題

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 値の操作」を参照してください。

MyISAMInnoDB、または MEMORY ストレージエンジンを使用している場合は、NULL 値を持つことができるカラムにインデックスを追加できます。 それ以外の場合は、インデックスが付けられるカラムを NOT NULL と宣言する必要があり、そのカラムには NULL を挿入できません。

LOAD DATA でデータを読み取ると、空または欠落しているカラムが''で更新されます。 NULL 値をカラムにロードするには、データファイルで \N を使用します。 状況によっては、リテラル文字 NULL も使用できます。 セクション13.2.7「LOAD DATA ステートメント」を参照してください。

DISTINCTGROUP 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 値に対して特殊な処理を行います。 NULLTIMESTAMP カラムに挿入すると、現在の日付と時間が挿入されます。 NULLAUTO_INCREMENT 属性を持つ整数カラムまたは浮動小数点カラムに挿入すると、シーケンスの次の数値が挿入されます。


関連キーワード:  カラム, ステートメント, テーブル, 挿入, 一般, エラー, 方法, カウント, サーバー, 関数