Documentation Home
MySQL 5.6 リファレンスマニュアル
Download this Manual
EPUB - 7.5Mb
HTML Download (TGZ) - 7.2Mb
HTML Download (Zip) - 7.2Mb


B.5.5.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 INFILE でデータが読み取られるときに、空のカラムまたは欠落しているカラムは '' で更新されます。NULL 値をカラムにロードするには、データファイルで \N を使用します。状況によっては、リテラル文字 NULL も使用できます。セクション13.2.6「LOAD DATA INFILE 構文」を参照してください。

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 属性を持つ整数カラムまたは浮動小数点カラムに挿入すると、シーケンスの次の数値が挿入されます。


User Comments
  Posted by Tinel Barb on December 15, 2011
Trying to know exactly how NULL is treated (to know when not to use the IFNULL replacement for large calculations), I was putting it in tests like this:

select 111+222+null as `how much?`; -- returns: NULL (logical evaluation?? should ignore it)

select sum(111+222+null) as `how much?`; -- returns: NULL (logical evaluation?? should ignore it)

select sum(a) as `how much?`
from (select 111 as a union select 222 union select null ) as b; -- returns: 333 (as SUM() on columns is ignoring NULL values)

select sum(a) as `how much?`
from (select 111 as a,'nume1' as nume
union select 222,'nume2'
union select null,'nume1' ) as b
group by nume; -- returns: 111 for nume='nume1' (testing GROUP BY for SUM)

select sum(a) as `how much?`
from (select 111 as a,'name1' as name
union select 222,'name2'
union select null,'name1' ) as b
where name='name1'; -- returns: 111 (testing filter for SUM)

As seen, when used in arithmetic operations NULL turns anything to NULL:
111+NULL => NULL
111*NULL => NULL
NULL/111 => NULL
111-NULL => NULL

BUT, when it comes to working on columns, NULL is ignored in most cases, EXCEPT when the NULL value is used in calculations between columns or columns and other type of values!

So,
select sum(@myconst+t.col1) from t [...]
will return NULL for fields with NULL values, not the fixed @myconst value!

Hope that helps the coding.

Sign Up Login You must be logged in to post a comment.