SQLにおけるNULLの扱い
表には必ずデータを入れなくてはならない訳ではありません。値を入れなくても良い列には、値が入っていなくても問題はありません。このように表の中に値が存在していないことを「NULL」(ヌル)といいます。 NULLは何も入っていない状態を表します。そのため、数値型の列に「0」が入っている状態や、文字列型の列にスペース、タブなどの「空白」が入っている状態とは異なります。NULLは本当に何も入っていないことを表します。 実際に問合せを行うと、ORACLEのSQL*PLUSでは何も表示されず、MS-SQLのクエリアナライザでは「NULL」という文字が返されます。 ここでは、次のような「社員名簿」表を使って解説します。社員名簿
社員番号 | 名前 | 出身地 | 年齢 |
1 | 山田太郎 | 東京都 | 28 |
2 | 佐藤花子 | □(半角スペース) | |
3 | 鈴木史郎 | 25 | |
4 | 斉藤美穂 | 24 |
ORACLE SQL*PLUSで問合せ SQL文 SELECT * FROM 社員名簿; 実行結果
社員番号 | 名前 | 出身地 | 年齢 |
1 | 山田太郎 | 東京都 | 28 |
2 | 佐藤花子 | ||
3 | 鈴木史郎 | 25 | |
4 | 斉藤美穂 | 24 |
MS-SQL クエリアナライザで問合せ SQL文 SELECT * FROM 社員名簿; 実行結果
ORACLEのSQL*PLUSでは、NULLも半角スペースの部分もすべて空白で返され、MS-SQLクエリアナライザでは、半角スペースは空白で、NULLのところには「NULL」と入って返されています。社員番号 | 名前 | 出身地 | 年齢 |
1 | 山田太郎 | 東京都 | 28 |
2 | 佐藤花子 | NULL | |
3 | 鈴木史郎 | NULL | 25 |
4 | 斉藤美穂 | NULL | 24 |
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 | 鈴木史郎 | NULL | 25 |
4 | 斉藤美穂 | NULL | 24 |
5 | 小泉純一郎 | 神奈川県 |
気を付けなければならないのが、文字列型の列をNULLにするINSERT文の記述です。NULLということは値がないということなので、次のように「出身地」列の値をシングルクォートで囲んだだけにしても、NULLになるといった想定もできます。
ORACLE INSERT INTO 名簿 VALUES ( 6, '竹下登', '', 23 );
IS NULL演算子
ここまでNULLやデータが空という意味が理解できたと思います。ただ、ORACLEなどでは、空白で出力された場合、NULLなのか空白文字が入っているのか区別がつきません。その場合に、NULLの認識に使うのがIS NULL演算子です。 先ほど5つ目の行を追加した「社員名簿」表でIS NULL演算子を使って問合せを行うと次のようになります。SQL文 SELECT * FROM 社員名簿 WHERE 年齢 IS NULL; 実行結果
WHERE句の指定で、「年齢」列がNULLの行だけを取得することができます。IS NULLの記述が数値型、文字列型のどちらにも同じように使うことができます。 また IS NULL演算子はNOT演算子と組合せて使うこともできます。このときの検索はNULLが入っていない行のデータを検索することになります。 SQLは英語の表記に基づいているので「NOT IS NULL」ではなくて、「IS NOT NULL」となります。次のように問合せると、「年齢」列のNULLが値にない行を出力することができます。社員番号 | 名前 | 出身地 | 年齢 |
2 | 佐藤花子 | ||
5 | 小泉純一郎 | 神奈川県 |
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;
実行結果 レコードが選択されませんでした。
関連リンク
次の章に進む

【SQLの基礎知識⑧】 文字列検索(ワイルドカードの使い方)
SQLにおける文字列検索のやり方を習得できます。ワイルドカードとLIKEキーワードの具体的・実践的な使用方法を解説したうえで、SQL文に対する実行結果を確認することで、理解を深めます。いちれべ.comは、オラクル、MS-SQL、MS-Access で使用可能か一目でわかるサイトです。
目次 (SQLの基礎知識の一覧ページ)

【SQLの基礎知識】基本ルールや基礎の基礎をマスターしよう
こちらの記事を読み進めることで、SQLの基礎が充分に身に付きます。これからSQLを身に着けたい初心者・入門者の方に最適です。データベース製品ごとに表現方法が異なることがありますので、ある程度SQLのスキルがある方も利用できるサイトです。