今日は NULL ― データベースの見えないヒーロー ― の扱いをもっと深掘りしていくよ。もし「NULLってただの“何もない”でしょ?」って思ってるなら、まあ半分正解。でもそれだけじゃないんだ。このレクチャーでは、データの中にNULLがあるかどうかをチェックする方法と、それにどう対応するかを学ぶよ。じゃあ、値がないものを追いかける準備はいい?
まずはシンプルな例から始めよう ― 例えばネットショップのデータベースを扱ってるとする。注文テーブルがあって、いくつかの注文にはコメントが入ってないけど、他の注文にはメモが書かれてる。もしコメントが空の注文だけ探したくて、普通の比較 = や <> を使ったら…びっくりするかも。なぜかって?NULLは特別な存在だから!
SQLではNULLの有無をチェックするのに、IS NULLとIS NOT NULLを使うんだ。この演算子たちがNULL問題を解決してくれる。
IS NULLで値をチェックする
IS NULLは、カラムや式がNULLかどうかを調べるために使うよ。
SELECT *
FROM orders
WHERE comment IS NULL;
このクエリは、commentカラムがNULLの行を全部返してくれる。つまり、コメントがない注文を探したいときに便利。
これがordersテーブルの例だよ:
| id | customer_name | total_amount | comment |
|---|---|---|---|
| 1 | Otto Art | 1500 | "至急配送" |
| 2 | Maria Chi | 3000 | NULL |
| 3 | Alex Lin | 2000 | '' |
| 4 | Anna Song | 5000 | NULL |
クエリ:
SELECT id, customer_name
FROM orders
WHERE comment IS NULL;
結果:
| id | customer_name |
|---|---|
| 2 | Maria Chi |
| 4 | Anna Song |
空文字列''の行は含まれてないことに注目してね。''はNULLじゃないから。
IS NOT NULLで値をチェックする
IS NOT NULLは逆の動き。つまり、値がNULLじゃないかどうかを調べる。例えば、コメントが入ってる注文だけ欲しいとき:
SELECT *
FROM orders
WHERE comment IS NOT NULL;
このクエリは、commentカラムに何かしらデータが入ってる(空文字列''も含む)行だけ返すよ。
例
ordersテーブルはさっきと同じだよ。
| id | customer_name | total_amount | comment |
|---|---|---|---|
| 1 | Otto Art | 1500 | "至急配送" |
| 2 | Maria Chi | 3000 | NULL |
| 3 | Alex Lin | 2000 | '' |
| 4 | Anna Song | 5000 | NULL |
クエリを実行してみよう:
SELECT id, customer_name, comment
FROM orders
WHERE comment IS NOT NULL;
結果:
| id | customer_name | comment |
|---|---|---|
| 1 | Otto Art | "至急配送" |
| 3 | Alex Lin | '' |
空文字列''の行も含まれてるのに注目。SQL的にはこれは「空じゃない」扱いなんだ。
IS NULLとIS NOT NULLはいつ使う?
こんなシーンで使えるよ:
- データのフィルタリング: 欠損値があるレコードを除外したいとき。
- エラー処理:
NULLが入力ミスのサインかもしれないから、そういう行を抽出したいとき。 - データ分析: 欠損値の数を数えて、データの質をチェックしたいとき。
実践で使ってみよう
いくつか練習問題をやってみよう:
課題1: 誕生日が未入力の学生を選ぶ
例えば、studentsテーブルがあるとする:
| id | name | birth_date |
|---|---|---|
| 1 | Otto Art | 2000-05-10 |
| 2 | Maria Chi | NULL |
| 3 | Alex Lin | 1998-12-30 |
| 4 | Anna Song | NULL |
クエリ:
SELECT name
FROM students
WHERE birth_date IS NULL;
結果:
| name |
|---|
| Maria Chi |
| Anna Song |
このクエリは、誕生日を確認しなきゃいけない学生を探すのに便利だよ。
課題2: コメントがある注文を選ぶ
| id | customer_name | total_amount | comment |
|---|---|---|---|
| 1 | Otto Art | 1500 | "至急配送" |
| 2 | Maria Chi | 3000 | NULL |
| 3 | Alex Lin | 2000 | '' |
| 4 | Anna Song | 5000 | NULL |
ordersテーブルで、コメントが入ってる注文を探すには:
SELECT customer_name, comment
FROM orders
WHERE comment IS NOT NULL;
結果:
| customer_name | comment |
|---|---|
| Otto Art | "至急配送" |
| Alex Lin | '' |
普通の演算子との違い
じゃあ、ちょっと寄り道して「間違った」クエリでNULLをチェックしてみよう:
SELECT *
FROM orders
WHERE comment = NULL;
びっくりした?このクエリは、commentがNULLの行すら返さないんだ。なぜなら、NULLは普通の演算子で比較できないから。こういう比較には絶対にIS NULLを使わなきゃダメ!
GO TO FULL VERSION