:: DEVELOPER ZONE
NULL 値というものを SQL 初心者はよく混乱します。SQL 初心者は、多くの場合、NULL が空文字 "" と同じであると考えてしまいます。これは違います。たとえば、以下のステートメントは完全に別のものです。
mysql> INSERT INTO my_table (phone) VALUES (NULL);
mysql> INSERT INTO my_table (phone) VALUES ("");
どちらのステートメントも、値を phone カラムに挿入しています。しかし、最初のステートメントは NULL 値を挿入し、2 つ目は空文字を挿入しています。最初のステートメントは ``電話番号が不明'' であると考えることができ、2番目は``電話を持っていない'' と考えることができます。
SQL では、NULL 値は、他の値と比較すると(NULLでも)常に偽になります。NULL を含む式は、演算子と式に含まれている関数のドキュメントに特に断りがなければ、常に NULL 値を生成します。以下の例では、全カラムが NULL を返します。
mysql> SELECT NULL,1+NULL,CONCAT('Invisible',NULL);
NULL のカラム値を検索したい場合、=NULL テストは使用できません。どんな式でも expr = NULL は偽なので、以下のステートメントはレコードを返しません。
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 = "";
MySQL バージョン 3.23.2 以降を使用し、かつ MyISAM、InnoDB、BDB テーブル型を使用している場合に限り、NULL 値を持つことができるカラムのインデックスを追加することができます。
以前のバージョンや別のテーブル型では、NOT NULL などのカラムを宣言する必要があります。これは、NULL をインデックス化されたカラムに挿入できないということでもあります。
LOAD DATA INFILE でデータを読み取ると、空のカラムは '' で更新されます。カラムに NULL 値が必要な場合は、テキストファイルで \N を使用してください。状況によっては、リテラル文字 'NULL' も使用されます。
See 項6.4.8. 「LOAD DATA INFILE 構文」。
ORDER BY を使用する際、降順でソートするように DESC を指定すると、NULL 値が最初または最後に表示されます。例外:
MySQL バージョン 4.0.2 から 4.0.10 では、ソート順序に関わらず NULL 値は 1 番目にソートされます。
GROUP BY を使用すると、すべての NULL 値が同じと見なされます。
COUNT()、MIN()、SUM() などの集約(要約)関数では、NULL 値は無視されます。例外は COUNT(*) です。この関数は、個々のカラム値ではなくレコードをカウントします。
たとえば、以下のステートメントでは 2つのカウントが行われます。
最初は、テーブルにあるレコード数のカウントです。2 番目は age カラムにある非 NULL 値のカウントです。
mysql> SELECT COUNT(*), COUNT(age) FROM person;
NULL 処理を補うために、IS NULL と IS NOT NULL 演算子と IFNULL() 関数を使用することができます。
カラム型の中には、NULL 値が特別に扱われるものがあります。テーブルの最初のカラム TIMESTAMP に NULL を挿入すると、現在の日付と時刻が挿入されます。AUTO_INCREMENT カラムに NULL を挿入すると、順番の次の番号が挿入されます。
© 1995-2005 MySQL AB. All rights reserved.
