CodeGym /コース /SQL SELF /NULLとの出会い。NULLと0の違い

NULLとの出会い。NULLと0の違い

SQL SELF
レベル 9, レッスン 0
使用可能

そろそろNULLについてもうちょい詳しく話そうか。これ、ただの空っぽな話じゃないよ。だってこのキャラ、見た目は…何もない。でも、もしテーブルが家だったら、NULLはその家の幽霊みたいなもん—静かで、謎めいてて、予測できない。いるっぽいけど、質問には答えないし、計算にも参加しないし、比較も避ける。ただの「空」じゃなくて、「何も分からない」ってことなんだ。

SQLの世界でNULLは、0でも空文字列でも、いつもの「データがない」って意味でもない。これは特別な「分からない」ってサインで、慎重に扱わなきゃいけない。今日は、NULLがただの変なゲストじゃなくて、どんなデータベースにも大事なメンバーだってことを見ていこう。だってこれはまさに「値が分からない、または未定義」って意味なんだよ。

NULLは空文字列や数字の0とどう違う?

初心者がよくNULLと他の値、例えば空文字列''や数字の0を混同しちゃう。じゃあ、キーとなる違いを見てみよう:

概念 意味
NULL 値が完全に存在しない。これはただの空箱じゃなくて、箱自体がないってこと
空文字列 これは文字が一つもない文字列。例えば:''
数字の0 具体的な数字で、ゼロって値を表してる

リアルな例:社員のテーブルがあって、給料を保存してるとする。給料が0なら、その人には何も払われてないってこと。でも給料がNULLなら、その人がいくらもらってるか分からない(もしくはまだ決まってない)ってことだよ。

NULLをどう解釈する?

もうちょっとNULLが何か分かってきたところで、SQLがどう扱うか見てみよう。NULLについて一番大事なのはこの一言:NULLは何にも等しくないし、何にも等しくない、たとえ自分自身でも。

SELECT NULL = NULL;  -- 結果: FALSE

びっくりでしょ?なんで?それはNULLが「分からない」だから。未知の値が2つあっても、それらが等しいとも違うとも言えないんだ。

いくつか例を見てみよう:

NULLを使った操作の例

SELECT NULL + 1;      -- 結果: NULL
SELECT NULL * 100;    -- 結果: NULL
SELECT NULL = 0;      -- 結果: FALSE
SELECT NULL <> 0;     -- 結果: FALSE

NULLは足し算でも掛け算でも、どんな計算でも必ずNULLを返す。ここでのNULLは数学の0とはちょっと違う動きをする。まるで何かを虚無に投げ込んで、その虚無が全部飲み込んじゃう感じ。

実践例

studentsっていう学生情報のテーブルを想像してみて:

id name birth_date grade
1 Alice 2000-01-01 85
2 Bob NULL 90
3 Charlie 1999-05-22 NULL
4 Diana NULL NULL

例1:NULLが条件に与える影響

もし誕生日がない学生を探したくて、WHERE birth_date = NULLって条件をつけたら:

SELECT *
FROM students 
WHERE birth_date = NULL;

何も結果が返ってこない。なぜならNULL = NULLはFALSEを返すから。NULLをチェックするにはIS NULLを使う必要があるよ:

SELECT * FROM students WHERE birth_date IS NULL;

結果:

id name birth_date grade
2 Bob NULL 90
4 Diana NULL NULL

例2:NULLが計算に与える影響

id name birth_date grade
1 Alice 2000-01-01 85
2 Bob NULL 90
3 Charlie 1999-05-22 NULL
4 Diana NULL NULL

全員の平均点を計算しようとしたら:

SELECT AVG(grade) FROM students;

結果は87.5になる。なぜ?NULLはAVGやSUM、MIN、MAXみたいな集約関数では無視されるから。でも注意して!もしNULLの行も考慮したいなら、追加の工夫が必要だよ。

NULLの扱いについては、次のレクチャーでもっと詳しくやるからね。

2
タスク
SQL SELF, レベル 9, レッスン 0
ロック未解除
HAVINGを使った平均評価のフィルタリング
HAVINGを使った平均評価のフィルタリング
2
タスク
SQL SELF, レベル 9, レッスン 0
ロック未解除
地域ごとの顧客数をフィルタして集計しよう
地域ごとの顧客数をフィルタして集計しよう
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION