【SQLの基礎知識⑦】 SQLにおけるNULLの扱い

SQLの基礎知識
SQLの基礎知識
この記事は約6分で読めます。
Recommended Articles

SQLにおけるNULLの扱い

表には必ずデータを入れなくてはならない訳ではありません。値を入れなくても良い列には、値が入っていなくても問題はありません。このように表の中に値が存在していないことを「NULL」(ヌル)といいます。

NULLは何も入っていない状態を表します。そのため、数値型の列に「0」が入っている状態や、文字列型の列にスペース、タブなどの「空白」が入っている状態とは異なります。NULLは本当に何も入っていないことを表します。

実際に問合せを行うと、ORACLEのSQL*PLUSでは何も表示されず、MS-SQLのクエリアナライザでは「NULL」という文字が返されます。

ここでは、次のような「社員名簿」表を使って解説します。

社員名簿

社員番号名前出身地年齢
1山田太郎東京都28
2佐藤花子□(半角スペース)
3鈴木史郎25
4斉藤美穂24

この表には「出身地」列と「年齢」列に空白があります。この空白は、佐藤花子さんの「出身地」列は半角スペースで空白にしてありますが、その他の空白はすべてNULLが指定されています。

このNULLが値として入力されている表に対して、すべての列を返すように問合せると、次のようになります。

ORACLE SQL*PLUSで問合せ

SQL文
SELECT * FROM 社員名簿;

実行結果

社員番号名前出身地年齢
1山田太郎東京都28
2佐藤花子
3鈴木史郎25
4斉藤美穂24
MS-SQL クエリアナライザで問合せ

SQL文
SELECT * FROM 社員名簿;

実行結果

社員番号名前出身地年齢
1山田太郎東京都28
2佐藤花子NULL
3鈴木史郎NULL25
4斉藤美穂NULL24

ORACLEのSQL*PLUSでは、NULLも半角スペースの部分もすべて空白で返され、MS-SQLクエリアナライザでは、半角スペースは空白で、NULLのところには「NULL」と入って返されています。

NULLの入力

では、NULLを表に追加するにはどのようにしたら良いのでしょうか?表のデータを追加するにはINSERT文を使います。(INSERT文については、こちらを参照して下さい。)このINSERT文でNULLを使えば良いのです。
では、「社員名簿」表に、年齢にNULLを指定したデータを追加してみましょう。
ORACLE
INSERT INTO 社員名簿 VALUES
( 5, '小泉純一郎', '神奈川県', NULL)
これで、表の「年齢」列の5行目にNULLで何も値が入っていないデータが追加されます。なお、入力したデータを表に保存するにはCOMMITを実行しておく必要があります。
では、ORACLEで表のすべてを出力すると次のように追加した小泉純一郎さんの「年齢」列が空白になります。
SQL文
SELECT * FROM 社員名簿;

実行結果

社員番号名前出身地年齢
1山田太郎東京都28
2佐藤花子NULL
3鈴木史郎NULL25
4斉藤美穂NULL24
5小泉純一郎神奈川県
気を付けなければならないのが、文字列型の列をNULLにするINSERT文の記述です。NULLということは値がないということなので、次のように「出身地」列の値をシングルクォートで囲んだだけにしても、NULLになるといった想定もできます。
ORACLE
INSERT INTO 名簿 VALUES ( 6, '竹下登', '', 23 );
ORACLEでは想定通りこれはNULLとして扱われます。しかし、MS-SQLでは「出身地」列の値をNULLとして認識してくれません。MS-SQLの場合には、文字列型であっても、「NULL」と明示的に記述する必要があります。

IS NULL演算子

ここまでNULLやデータが空という意味が理解できたと思います。ただ、ORACLEなどでは、空白で出力された場合、NULLなのか空白文字が入っているのか区別がつきません。その場合に、NULLの認識に使うのがIS NULL演算子です。

先ほど5つ目の行を追加した「社員名簿」表でIS NULL演算子を使って問合せを行うと次のようになります。

SQL文
SELECT * FROM 社員名簿 WHERE 年齢 IS NULL;

実行結果

社員番号名前出身地年齢
2佐藤花子
5小泉純一郎神奈川県

WHERE句の指定で、「年齢」列がNULLの行だけを取得することができます。IS NULLの記述が数値型、文字列型のどちらにも同じように使うことができます。

また IS NULL演算子はNOT演算子と組合せて使うこともできます。このときの検索はNULLが入っていない行のデータを検索することになります。

SQLは英語の表記に基づいているので「NOT IS NULL」ではなくて、「IS NOT NULL」となります。次のように問合せると、「年齢」列のNULLが値にない行を出力することができます。

SQL文
SELECT * FROM 社員名簿 WHERE 年齢 IS NOT NULL;

実行結果

社員番号名前出身地年齢
1山田太郎東京都28
3鈴木史郎25
4斉藤美穂24

社員名簿

社員番号名前出身地年齢
1山田太郎東京都28
2佐藤花子
3鈴木史郎25
4斉藤美穂24
最後に、NULLを用いた問合せで、よく間違えるケースを紹介します。
SQL文
SELECT * FROM 社員名簿 WHERE 年齢 = NULL;
実行結果
レコードが選択されませんでした。

ここでは、比較演算子の=演算子を使って、年齢がNULLの行を判断しようとしています。しかし、実際にはNULLが入っている行(レコード)があるのに、「レコードが選択されませんでした」という結果が出ています。NULLかどうかには、IS NULL演算子を使わないと判断ができないのです。

関連リンク

次の章に進む
【SQLの基礎知識⑧】 文字列検索(ワイルドカードの使い方)
SQLにおける文字列検索のやり方を習得できます。ワイルドカードとLIKEキーワードの具体的・実践的な使用方法を解説したうえで、SQL文に対する実行結果を確認することで、理解を深めます。いちれべ.comは、オラクル、MS-SQL、MS-Access で使用可能か一目でわかるサイトです。
目次 (SQLの基礎知識の一覧ページ)
【SQLの基礎知識】基本ルールや基礎の基礎をマスターしよう
こちらの記事を読み進めることで、SQLの基礎が充分に身に付きます。これからSQLを身に着けたい初心者・入門者の方に最適です。データベース製品ごとに表現方法が異なることがありますので、ある程度SQLのスキルがある方も利用できるサイトです。

Recommended Articles