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
を挿入すると、順番の次の番号が挿入されます。
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.