そろそろ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の扱いについては、次のレクチャーでもっと詳しくやるからね。
GO TO FULL VERSION