SQL入門
データベースにおけるNULLの扱い方

SQLの初心者向け入門解説、VBAからデータベースを扱うためのSQLを解説
公開日:2019-12-02 最終更新日:2019-12-02

データベースにおけるNULLの扱い方


エクセルVBAでデータベースを扱うためのSQL入門です。
前回はSQL関数と演算子について解説しましたが、その中でNULLに関するものがでてきました。
「NULLについては、次回詳しく解説します。」と記載、今回はNULLについて解説します。


エクセルにおいては、空欄に見えても、完全に空欄(Empty)の場合と長さ0の文字列の違いで苦慮することがあります。
これと同様に、データベースにおいてもNULLと空文字(長さ0の文字列)は意識して扱う必要があります。

NULLの扱いが正しく行われないと、間違った結果になってしまいます。
データベースにおいてNULLの扱いは特別に判定する必要があり、NULLを判定するための専用の演算子やSQL関数が用意されています。
演算子やSQL関数を紹介しつつ、NULLの扱い方について順に解説していきます。

NULLデータのINSERT

テーブル定義は、以下を使います。
CREATE TABLE t_sales (
 'id' INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL
,'code' TEXT NOT NULL
,'name' TEXT NOT NULL
,'address' TEXT
,'sales_date' TEXT
,'item_code' TEXT
,'item_name' TEXT
,'item_price' INTEGER
,'item_count' INTEGER
,'item_amount' INTEGER
,'comment' TEXT
);

このテーブルにデータをINSERTしたとき、フィールドをNULLにする方法は大きく分けると2通りあります。
逆の言い方をすれば、フィールドがNULLになる原因が2通りあるという事です。

省略されたフィールド
INSERT時には、全てのカラムを指定する必要はありません。
データを挿入するカラムだけ指定することができます。
ただし、NOT NULL制約のカラムは省略できません。
INSERT INTO t_sales ("code","name") VALUES ('A01',"名称A01")
このSQLを実行すると、codeとname以外の省略されたカラムは全てNULLになります。
(もちろんidは連番が振られます。)
codeとnameは、NOT NULL制約になっているので省略できませんが、他のカラムは制約がありませんので省略可能です。
そして、省略したカラムはNULLになります。

マクロ VBA SQL NULL
※「DB Rrowser for SQLite」の画面

DEFAULTが指定されている場合
カラム定義にDEFAULTが指定されている場合は、カラム省略時はその値が挿入されます。
以下で説明していますが、文字列型にNULLがあると文字列結合が面倒になります。
文字列結合するようなカラムにはNOT NULLやDEFAULTで空文字を指定することを検討してください。

VALUESにNULLを指定
VALUEとして''(空文字、長さ0の文字列)ではNULLにならず空文字になってしまいます。
VALUEにNULLを指定するには、キーワードとしてnullまたはNULLと記述します。
INSERT INTO t_sales
 ("code","name","address","sales_date","item_code"
,"item_name","item_price","item_count","item_amount","comment")
 VALUES
 ('A01','名称A01',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL)
,('A01','名称A01',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL)
,('A01','名称A01','','','','',100,1,100,'')
,('A01','名称A01','','','','',100,2,200,'')
,('A01','名称A01','','','','',100,3,300,'')

マクロ VBA SQL NULL
※「DB Rrowser for SQLite」の画面

NULLと''の違いを確認してください。
これ以降は、上記のデータをSELECTした時の結果を掲載しています。

NULLに関する演算子とSQL関数

IS NULL演算子

式 IS NULL
式がNULLかどうかを判定します。
式がNULLの場合に真を返します。
否定の場合は、
IS NOT NULL
とします。

式 = NULL
これではNULL判定できません。

IFNULL関数

IFNULL(式, 値)
式の値がNULLの場合は第2引数の値を返します。
式の値がNULL以外の場合は式の値を返します。

IS NULL の使用例

以降のサンプルVBAでは、以下のクラスを使用しています。
VBAクラスの全コード:データの取得
SQL入門の「データの取得:条件指定(SELECT,WHERE)」時点のVBAクラスの全コードです。ADOを使ったDB接続のVBAクラスの全コード クラスモジュール:clsSQLite
Sub SelectNull()
  Dim clsDB As New clsSQLite
  clsDB.DataBase = "C:\SQLite3\sample.db"
  
  Dim ws As Worksheet
  Set ws = ActiveSheet
  
  Dim sSql As String
  sSql = ""
  sSql = sSql & "SELECT *"
  sSql = sSql & " FROM t_sales"
  sSql = sSql & " WHERE code = 'A01'"
  sSql = sSql & "  AND item_code IS NULL"
  
  If Not clsDB.SheetFromRecordset(sSql, ws.Range("A1"), Clear, True) Then
    MsgBox clsDB.ErrMsg
    Exit Sub
  End If
  
  Set clsDB = Nothing
End Sub

実行結果のシートです。

マクロ VBA SQL NULL


※これ以降はSQL部分のみ掲載します。

IS NOT NULL の使用例

sSql = sSql & "SELECT *"
sSql = sSql & " FROM t_sales"
sSql = sSql & " WHERE code = 'A01'"
sSql = sSql & "  AND item_code IS NOT NULL"

実行結果のシートです。

マクロ VBA SQL NULL

IFNULL の使用例

sSql = sSql & "SELECT code,name"
sSql = sSql & ",IFNULL(item_code,'ヌル'),IFNULL(item_name,'ヌル')"
sSql = sSql & " FROM t_sales"
sSql = sSql & " WHERE code = 'A01'"

実行結果のシートです。

マクロ VBA SQL NULL

文字列結合におけるNULLの挙動

演算子||では、結合文字のどちらかがNULLの場合はNULLになります。

sSql = sSql & " IFNULL(name,'ヌル'),IFNULL(item_name,'ヌル')"
sSql = sSql & ",IFNULL(name || item_name,'ヌル')"
sSql = sSql & " FROM t_sales"
sSql = sSql & " WHERE code = 'A01'"

実行結果のシートです。

マクロ VBA SQL NULL

※他のDBにおける、||演算子およびCONCAT関数
多くのDBにおいてNULLがあると結果がNULLになります。
ただし、DBによっては空文字になるものもあります。
NOT NULL制約のないカラムの場合は、IFNULL関数を使うようにしてください。

集計関数におけるNULLの挙動

ほとんどの集計関数では、NULLのフィールドは無視して集計されます。

sSql = sSql & "SELECT code"
sSql = sSql & ",COUNT(*)"
sSql = sSql & ",COUNT(item_amount)"
sSql = sSql & ",SUM(item_amount)"
sSql = sSql & ",AVG(item_amount)"
sSql = sSql & " FROM t_sales"
sSql = sSql & " WHERE code = 'A01'"
sSql = sSql & " GROUP BY code"

実行結果のシートです。

マクロ VBA サンプル画像

COUNT(*)は、対象の行数(レコード数)を返します。
COUNT(カラム名)は、NULL以外のセルの個数を返します。
SUM関数、AVG関数、MAX関数、MIN関数はNULLを無視します。

SQLiteでは数値型のカラムでも文字列が入ってしまいます。
数値型のカラムに数値以外(文字列)が入っている場合、集計関数はNULL同様に無視されます。
数値とNULLの四則演算
結果はNULLとなります。

NULLの扱い方の最後に

そもそも、できればNULLがないほうが扱いやすいものです。
少なくとも、文字列型のカラムはNULLにならないようにした方が扱いやすいでしょう。

SQLiteでは数値型の列でさえ文字列を入れられてしまいますが、
他のDBでは、指定のデータ型(数値型や日付時刻型)以外のデータは入れることが出来ず、指定のデータ型またはNULLしか入れることができません。
例えば、数値や日付時刻が存在しない場合として、どうしてもNULLを入れておく必要が出てきます。
そして、常にNULLの扱いは面倒なものです。

全てのカラムでNULL対応するのは、むやみに記述を増やしてしまいますので、
NULLがあるのかないのか、しっかりと把握してSQLを書くようにしてください。

さて、いよいよこれからは複数テーブルを結合するSQLに入っていきます。
それは、データをマスタデータとトランザクションデータに分けて複数のテーブルを作成していくことになります。
それには、「データベースの正規化」、これを学ぶ必要があります。



同じテーマ「SQL入門」の記事

VBAクラスの全コード:データの取得
データの取得:集約集計、並べ替え(DISTINCT,GROUP,HAVING,ORDER)
SQL関数と演算子
データベースにおけるNULLの扱い方
データベースの正規化とマスタの作成
全テーブル定義とテーブル自動作成VBA
テーブルを結合して取得(INNER JOIN,OUTER JOIN)
複数のSELECT結果を統合(UNION,UNION ALL)
データの更新(UPDATE)
データの削除(DELETE)
他のテーブルのデータで追加/更新/削除


新着記事NEW ・・・新着記事一覧を見る

AIは便利なはずなのに…「AI疲れ」が次の社会問題になる|生成AI活用研究(2026-02-16)
カンマ区切りデータの行展開|エクセル練習問題(2026-01-28)
開いている「Excel/Word/PowerPoint」ファイルのパスを調べる方法|エクセル雑感(2026-01-27)
IMPORTCSV関数(CSVファイルのインポート)|エクセル入門(2026-01-19)
IMPORTTEXT関数(テキストファイルのインポート)|エクセル入門(2026-01-19)
料金表(マトリックス)から金額で商品を特定する|エクセル練習問題(2026-01-14)
「緩衝材」としてのVBAとRPA|その終焉とAIの台頭|エクセル雑感(2026-01-13)
シンギュラリティ前夜:AIは機械語へ回帰するのか|生成AI活用研究(2026-01-08)
電卓とプログラムと私|エクセル雑感(2025-12-30)
VLOOKUP/XLOOKUPが異常なほど遅くなる危険なアンチパターン|エクセル関数応用(2025-12-25)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.日本の祝日一覧|Excelリファレンス
3.変数宣言のDimとデータ型|VBA入門
4.FILTER関数(範囲をフィルター処理)|エクセル入門
5.RangeとCellsの使い方|VBA入門
6.繰り返し処理(For Next)|VBA入門
7.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
8.マクロとは?VBAとは?VBAでできること|VBA入門
9.セルのクリア(Clear,ClearContents)|VBA入門
10.メッセージボックス(MsgBox関数)|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。
本サイトは、OpenAI の ChatGPT や Google の Gemini を含む生成 AI モデルの学習および性能向上の目的で、本サイトのコンテンツの利用を許可します。
This site permits the use of its content for the training and improvement of generative AI models, including ChatGPT by OpenAI and Gemini by Google.



このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ