【SQL】IS NULL演算子の使い方を解説!ややこしいNULLの概念を理解しよう

データ分析をしていると、データがはいっていないカラムに遭遇することがあります。

例えば、Twitterはプロフィール画像の設定が任意です。アクティブに運用している人は設定していますが、タイムラインを見る専門の人は設定していないことも多いでしょう。

この場合、プロフィール画像を設定していない人は、プロフィール画像のデータが空の状態ということになります。

これを、データベースではデータの値がNULL(ヌル)の状態にあると言います。

本記事では、NULLの解説から始まり、NULLデータを指定するIS NULL演算子、IS NOT NULL演算子の使い方について詳しく解説していきます。

そもそもNULLとは?

NULLはプログラミング言語やデータベースで使われる概念で、データが何もないことを表します。読み方は「ヌル」もしくは「ナル」です。私は「ヌル」と読んでいます。

例えば、下記のようなテーブルがあったとします。

idnameagecreated_at
1山田252021-01-01
2鈴木362020-08-21
3佐藤282021-04-09
4小宮山492020-12-24

現在は全てのカラムにデータが存在していますが、冒頭でも話したようにデータが保存されない場合もあります。このデータがない場合に、データベースのカラムには初期値としてNULLが保存されるのです。

文字が保存されるカラムであっても数値が保存されるカラムであっても、データが何も入っていない場合にはNULLが自動で割り当てられます。

仮に、IDが3のnameカラムにデータが存在しない場合、下記のようになります。

idnameagecreated_at
1山田252021-01-01
2鈴木362020-08-21
3NULL282021-04-09
4小宮山492020-12-24

IDが3のnameカラムには「データが何もない」という意味を持つNULLが自動で保存されます。

NULLは0(ゼロ)ではない

データがないのであれば、0でいいのでは?という声が聞こえてきそうですが、明確に異なります。

0はデータの種類が数値です。よって、0という数値データが保存されているということになるのです。データが存在しないことを示すNULLとは全くもって別物です。

NULLは' '(空の文字)ではない

同じように、空の文字も明確にNULLとは異なります。

' 'はあくまで文字のデータです。よって、' 'という文字データが保存されていることになります。データが存在しないという意味のNULLとは別物です。

データベースにおいてNULLの検索は特殊

ここまで説明してきたとおり、データベースにおいてNULLとそれ以外のデータ(文字や数値など)は区別して扱われます。よって、文字や数値データと同じように検索をすることができません。

NULLが入ったデータを検索しようと思うと、真っ先に思い浮かぶのがカラム名 = NULLだと思います。しかし、これではNULLを含んだ項目を検索することはできません

また、先ほどの例ではIDが3のnameカラムはNULLになっていました。そこで、例えばname != '山田'と検索すればNULLが入ったデータも取得できるように思うかもしれません。

しかし、これでもNULLは検索に引っ掛からないのです。

検索結果は下記のようになります。

idnameagecreated_at
2鈴木362020-08-21
4小宮山492020-12-24

NULLが保存されているレコードは取得できません。

NULLが入った項目を検索する場合には、「IS NULL演算子」を使う必要があります。では、次からはIS NULL演算子について詳しく解説していきます。

IS NULL演算子

IS NULL演算子は指定したカラムがNULLであるデータを取得します。主に、WHERE句と一緒に使われます。

基本構文

SQL
SELECT カラム名
FROM テーブル名
WHERE カラム名 IS NULL

サンプルデータ(usersテーブル)

idnameageaddress
1山田25東京都
2鈴木38NULL
3佐藤28大阪府
4小宮山47NULL
5武田17NULL
usersテーブル

検索クエリ

usersテーブルのaddressカラムがNULLであるレコードを取得する

SQL
SELECT *
FROM users
WHERE address IS NULL

実行結果

idnameageaddress
2鈴木38NULL
4小宮山47NULL
5武田17NULL
usersテーブル

addressNULLが保存されているレコードのみ取得できました。

IS NOT NULL演算子

IS NOT NULL演算子はIS NULLの否定形で、指定したカラムがNULLではないデータを取得します。

基本構文

SQL
SELECT カラム名
FROM テーブル名
WHERE カラム名 IS NOT NULL

検索クエリ

usersテーブルのaddressカラムにデータが保存されているレコードを取得する

SQL
SELECT *
FROM users
WHERE address IS NOT NULL

実行結果

idnameageaddress
1山田25東京都
3佐藤28大阪府
usersテーブル

addressNULLではないレコードのみ取得できました。

内容のまとめ

  • NULLはデータが何もないことを意味する
  • データの種類に関わらず、データの初期値としてNULLが保存される
  • NULLは0(ゼロ)でも' '(空文字)とも異なる
  • NULLの検索には比較演算子を用いることができない
  • NULLのデータを検索するためにはIS NULL演算子を使う
  • NULLではないデータを検索するためにはIS NOT NULL演算子を使う