CodeGym /コース /SQL SELF /NULL値のチェック: IS NULL と IS NOT NULL

NULL値のチェック: IS NULL と IS NOT NULL

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

今日は 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はいつ使う?

こんなシーンで使えるよ:

  1. データのフィルタリング: 欠損値があるレコードを除外したいとき。
  2. エラー処理: NULLが入力ミスのサインかもしれないから、そういう行を抽出したいとき。
  3. データ分析: 欠損値の数を数えて、データの質をチェックしたいとき。

実践で使ってみよう

いくつか練習問題をやってみよう:

課題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を使わなきゃダメ!

2
タスク
SQL SELF, レベル 9, レッスン 1
ロック未解除
値が存在しないレコードの検索
値が存在しないレコードの検索
2
タスク
SQL SELF, レベル 9, レッスン 1
ロック未解除
利用可能なデータによるフィルタリング
利用可能なデータによるフィルタリング
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION