NULLの判定には「IS NULL」や「IS NOT NULL」を使用しますが、その扱いには注意が必要です。本記事ではデータベースにおける「NULL」値について解説します。ぜひ今後のSQL学習の参考にしてください。
そもそも「NULL」とは?
NULL値とは、値と言っていますが、わかりやすく言うと、「データが存在しない」という概念です。データベースにおいては、フィールドに値が入力されていない場合に「値がNULLである」といいます。NULL値は、ゼロ値や空文字とは異なります。
サンプルコード
説明には、サンプルとして「test」テーブルを用意しました。
「test」テーブル
ID(id) | 氏名(name) | 点数(point) |
1 | 秋山 | 80 |
2 | 久保田 | 100 |
3 | 佐々木 | NULL |
4 | 佐藤 | 70 |
5 | 鈴木 | NULL |
6 | 田中 | 90 |
7 | 土屋 | 60 |
IS NULL演算子
NULL判定を行う演算子で、主に「WHERE」内で使用されます。大半のデータベースで使える演算子です。
「IS NULL」演算子でNULLを抽出する
「IS NULL」演算子を用いてNULL値を抽出できます。
【使用イメージ】
SELECT カラム名 FROM テーブル名 WHERE カラム名 IS NULL;
テストを受けていない生徒を抽出します。
【SQL実行コード】
SELECT * FROM test WHERE point IS NULL;
【実行結果】
id | name | point |
3 | 佐々木 | NULL |
5 | 鈴木 | NULL |
「IS NOT NULL」演算子でNULL以外を抽出する
「IS NOT NULL」演算子を用いてNULL値以外を抽出できます。
【使用イメージ】
SELECT カラム名 FROM テーブル名 WHERE カラム名 IS NOT NULL;
テストを受けた生徒を抽出します。
【SQL実行コード】
SELECT * FROM test WHERE point IS NULL;
【実行結果】
id | name | point |
1 | 秋山 | 80 |
2 | 久保田 | 100 |
4 | 佐藤 | 70 |
6 | 田中 | 90 |
7 | 土屋 | 60 |
NULLは等号・等号否定・不等号の対象にならない
データを抽出する際、「カラム名 != ‘検索値’」としてもNULL値を含むレコードは抽出されません。また、「カラム名 = NULL」ではNULLを含むデータを抽出できません。これは、NULLは等号(=)、等号否定(!=)、不等号(<、>、≦、≧)の対象にならないからです。実際に見てみましょう。
◆等号は使えない
【SQL実行コード】
SELECT * FROM test WHERE point = NULL;
【実行結果】
(NULLを含むレコードも抽出できない)
抽出データなし
◆等号否定は使えない①
【SQL実行コード】
SELECT * FROM test WHERE point != NULL;
【実行結果】
(NULLを含むレコードも抽出されてしまう)
id | name | point |
1 | 秋山 | 80 |
2 | 久保田 | 100 |
3 | 佐々木 | NULL |
4 | 佐藤 | 70 |
5 | 鈴木 | NULL |
6 | 田中 | 90 |
7 | 土屋 | 60 |
◆等号否定は使えない②
【SQL実行コード】
SELECT * FROM test WHERE point != 80;
【実行結果】
(NULLを含むレコードが抽出できない)
id | name | point |
2 | 久保田 | 100 |
4 | 佐藤 | 70 |
6 | 田中 | 90 |
7 | 土屋 | 60 |
データベースでNULLを検索するには、「IS NULL」演算子を、NULLを含まないレコードを検索するには「IS NOT NULL」演算子を使用する必要があります。
NULLと空文字の違い
冒頭でも説明した通り、NULLと空文字は別物です。
NULLが「中身が存在しない」のに対し、空文字は「長さ0の文字列、すなわち、空のデータが存在する」と表現します。
空文字のみ抽出する
SELECT * FROM テーブル名 WHERE カラム名 = '';
NULLのみ抽出する
SELECT * FROM テーブル名 WHERE カラム名 IS NULL;
空文字とNULL値以外を抽出する(str != ”;の挙動に注意)
SELECT * FROM テーブル名 WHERE カラム名 != '';
NULL値以外を抽出する
SELECT * FROM テーブル名 WHERE カラム名 IS NOT NULL;
「ISNULL」関数
「ISNULL」関数はNULLを任意の文字列に置換する関数です。SQL Server・Accessで使用できます。ほかの主要データベースでは同じ機能を持つ関数名があるので併せて紹介します。
【使用イメージ】
ISNULL([指定するカラム], [置換したい文字列])
第一引数に「NULLをチェックするカラム名」、第二引数に「NULLだった場合に置換する文字列」を入力します。
テストテーブルの点数がNULLの場合に「未受験」に表示したい場合は次のように記述します。
【SQL実行コード】
SELECT ISNULL(point,'未受験') FROM test;
環境ごとの類似関数
データベースによって類似関数があります。
◆Mysql・SQLite
SELECT IFNULL(point,'未受験') FROM test;
◆PostgreSQL
SELECT COALESCE(point,'未受験') FROM test;
◆Oracle
SELECT NVL(point,'未受験') FROM test;
「INSERT」文でNULL値を登録する
テーブルにデータを追加する「INSERT」文で、特定のカラムにNULLを登録してみましょう。
「中村」という生徒を追加します。
【SQL実行コード】
INSERT INTO ITEM
(id,name,point)
VALUES
('8','中村',NULL);
「SELECT」文でデータを参照します。
【実行結果】
id | name | point |
1 | 秋山 | 80 |
2 | 久保田 | 100 |
3 | 佐々木 | NULL |
4 | 佐藤 | 70 |
5 | 鈴木 | NULL |
6 | 田中 | 90 |
7 | 土屋 | 60 |
8 | 中村 | NULL |
「UPDATE」文でNULL値に更新する
テーブルのデータを変更する「UPDATE」文で、NULL値に変更してみましょう。
「秋山」さんのデータを更新します。
【SQL実行コード】
UPDATE
ITEM
SET
CATEGORY = NULL
WHERE id =1;
「SELECT」文でデータを参照します。
【実行結果】
id | name | point |
1 | 秋山 | NULL |
2 | 久保田 | 100 |
3 | 佐々木 | NULL |
4 | 佐藤 | 70 |
5 | 鈴木 | NULL |
6 | 田中 | 90 |
7 | 土屋 | 60 |
8 | 中村 | NULL |
「NOT NULL」で制約する
「NOT NULL」を用いることで中身にNULL値を指定できないようにできます。
【SQL実行コード】
CREATE TABLE テーブル名(カラム名 NOT NULL, ...);
この制約のあるカラムにNULL値を含むレコードや中身を未指定のカラムを追加しようとすると、「Error: NOT NULL constraint failed: user.name」というエラー表示になります。
SQL関連記事
- RDBを操作するデータベース言語「SQL」とは?
- RDB以外のデータベース管理システム「NoSQL」とは?
- RDB管理システム「MySQL」とは?
- RDB管理システム「PostgreSQL」とは?
- RDB管理システム「SQL Server」とは?
- RDB管理システム「SQLite」とは?
- ブラウザ上でMySQLを管理できる「phpMyAdmin」とは?
- データを抽出する「SELECT」文
- データを追加する「INSERT」文
- データを削除する「DELETE」文
- データを更新する「UPDATE」文
- 抽出条件を指定する「WHERE」句
- 抽出条件を指定する「HAVING」句
- 複数の抽出条件をまとめる「IN」句
- 重複レコードを除外する「DISTINCT」
- 抽出範囲を指定する「BETWEEN」演算子
- 抽出条件を満たすレコードの存在の有無を調べる「EXISTS」句
- レコード件数を取得する集計関数「COUNT」関数
- レコードをグループ化する「GROUP BY」句
- 抽出結果を並び替える「ORDER BY」句
- テーブル間のデータを結合する「JOIN」句
- 抽出結果を統合して表示する「UNION」句
- データの曖昧検索「LIKE」句
- 条件分岐処理「CASE」式
SQLの勉強方法は?
書籍やインターネットで学習する方法があります。昨今では、YouTubeなどの動画サイトやエンジニアのコミュニティサイトなども充実していて多くの情報が手に入ります。
そして、より効率的に知識・スキルを習得するには、知識をつけながら実際に手を動かしてみるなど、インプットとアウトプットを繰り返していくことが重要です。特に独学の場合は、有識者に質問ができたりフィードバックをもらえるような環境があると、理解度が深まるでしょう。
ただ、SQLに限らず、ITスキルを身につける際、どうしても課題にぶつかってしまうことはありますよね。特に独学だと、わからない部分をプロに質問できる機会を確保しにくく、モチベーションが続きにくいという側面があります。独学でモチベーションを維持する自信がない人にはプログラミングスクールという手もあります。費用は掛かりますが、その分スキルを身につけやすいです。しっかりと知識・スキルを習得して実践に活かしたいという人はプログラミングスクールがおすすめです。
プログラミングスクールならテックマニアがおすすめ!
ITスキル需要の高まりとともにプログラミングスクールも増えました。しかし、どのスクールに通うべきか迷ってしまう人もいるでしょう。そんな方にはテックマニアをおすすめします!これまで多くのITエンジニアを育成・輩出してきたテックマニアでもプログラミングスクールを開講しています。
<テックマニアの特徴>
・たしかな育成実績と親身な教育 ~セカンドキャリアを全力支援~
・講師が現役エンジニア ~“本当”の開発ノウハウを直に学べる~
・専属講師が学習を徹底サポート ~「わからない」を徹底解決~
・実務ベースでスキルを習得 ~実践的な凝縮カリキュラム~
このような特徴を持つテックマニアはITエンジニアのスタートラインとして最適です。
話を聞きたい・詳しく知りたいという方はこちらからお気軽にお問い合わせください。