Webサイト制作コースのお申し込みはこちら

データベースでデータの追加・変更を行う際にNULLは他とは違う特殊な動作となります。

空文字 = NULLと思っていると意外な場所で嵌ってしまうこともあるので注意が必要です。

そこで今回は「SQLでUPDATEを行う際のNULLの扱い」について解説をしてみたいと思います。

NULLと空文字は別モノ

まずはNULLについて簡単に説明します。

NULLは「ヌル」もしくは「ナル」と読みます。

SQLにおいてのNULLは、レコードに何も入っていない状態を指します。

初心者の方は空文字をNULLと思っている方も多く見られますが、空文字とは違うため混同しないようにしてください。

例えば次のようなデータベーステーブルがあったとします。

id          stuff_id    sex        checkup_date
----------- ----------- ---------- ----------------
          1           1 male                   NULL
          2           2 male             2020-05-24
          3           3 female                 NULL
          4           4 female           2020-06-11
          5           5 male             2020-04-16

このテーブルでは、”checkup_date”には「NULL値」が入っています。

このテーブルで試しに「空文字」を検索してみましょう。クエリは分かりやすいように「SELECT checkup_date FROM sample_table_B WHERE checkup_date = ”」とします。

すると次のような結果となりました。

SELECT checkup_date FROM sample_table_B WHERE checkup_date = '';
GO

checkup_date
----------------

(0 行処理されました)

実行してもnullはHITしません。

この理由として、空文字はデータベース上では「空文字という文字列が存在する」というカタチで扱われます。

よって、NULL値という「何も存在しない」値とは別のモノとして扱われているわけです。

これでNULL値と空文字の違いについてはお分かりいただけたと思います。

UPDATEでnullを扱う

ここまでの説明でnullに関する予備知識は一通りご理解いただけたと思いますので、ここからはnullをUPDATEでどのように扱うかについて解説してみたいと思います。

UPDATEでデータの更新を行う際には、何かの情報をnullに書き換える場合、そしてもう一つは、null値の存在するレコードに対し、null値から別の値に更新しようとする方法の二通りあります。

レコードに登録されている特定のカラムの値を書き換える

「NULLと空文字は別モノ」で触れているように、NULL値は通常の検索では検索結果として反映されません。

例えば先ほどのテーブルがあるとします。

このテーブルのcheckup_dateの値がNULL値以外のもの全てをNULL値に変更してみましょう。

記述方法はまず何も考えずWHEREで条件指定してみます。

UPDATE
     sample_table_B
SET
     checkup_date = NULL
WHERE
     checkup_date != NULL
;
GO

(0 行処理されました)

SELECT * FROM sample_table_B;
GO

id          stuff_id    sex        checkup_date
----------- ----------- ---------- ----------------
          1           1 male                   NULL
          2           2 male             2020-05-24
          3           3 female                 NULL
          4           4 female           2020-06-11
          5           5 male             2020-04-16

WHEREで条件指定したにもかかわらず、書き換わっていないことが確認できます。

では次のコードを見てみましょう。

UPDATE
     sample_table_B
SET
     checkup_date = NULL
WHERE
     checkup_date IS NOT NULL
;
GO

(3 行処理されました)

SELECT * FROM sample_table_B;
GO

id          stuff_id    sex        checkup_date
----------- ----------- ---------- ----------------
          1           1 male                   NULL
          2           2 male                   NULL
          3           3 female                 NULL
          4           4 female                 NULL
          5           5 male                   NULL

こちらの記述では、きちんとNULL値でないレコードだけを抽出しNULL値に変更されていることが確認できます。

このようにUPDATEでNULL値を扱う場合には、条件指定で「IS NULL」もしくは「IS NOT NULL」として指定する必要があります。

複数条件の中にNULLに関する条件がある場合

次に、複数条件の中にNULLに関する条件がある場合を想定してみましょう。

複数条件を一つのクエリで実行するためには通常「IN句」を使用しますので、サンプルコードでも同じようにIN句を使用します。

また今回のサンプルテーブルは以下の通りとなっています。

id          stuff_id    sex        checkup_date
----------- ----------- ---------- ----------------
          1           1 male                   NULL
          2           2 male             2019-05-24
          3           3 female                 NULL
          4           4 female           2020-06-11
          5           5 male             2020-04-16

サンプルコードは次の通りです。

UPDATE
     sample_table_B
SET
     checkup_date = '1900-01-01'
WHERE
     checkup_date IN ('2019-05-24', NULL)
;
GO

(1 行処理されました)

SELECT * FROM sample_table_B;
GO

id          stuff_id    sex        checkup_date
----------- ----------- ---------- ----------------
          1           1 male                   NULL
          2           2 male             1900-01-01
          3           3 female                 NULL
          4           4 female           2020-06-11
          5           5 male             2020-04-16

IN句を使った複数条件でNULL値を指定しても、先ほどの説明と同じように反映されていないことが確認できます。

それでは次のコードではどうでしょうか。

UPDATE
     sample_table_B
SET
     checkup_date = '1900-01-01'
WHERE
     checkup_date IN ('2019-05-24')
OR
     checkup_date IS NULL
;
GO

(3 行処理されました)

SELECT * FROM sample_table_B;
GO

id          stuff_id    sex        checkup_date
----------- ----------- ---------- ----------------
          1           1 male             1900-01-01
          2           2 male             1900-01-01
          3           3 female           1900-01-01
          4           4 female           2020-06-11
          5           5 male             2020-04-16

今度は指定された全ての条件で書き換わっていることが確認できます。

このように、NULL値を条件として指定する場合には、他の条件とは別で分ける必要があります。

まとめ

今回は「SQLでUPDATEを行う際のNULLの扱い」について解説してみましたが、いかがでしたか?

NULL値はデータベースの概念上「そこに何も存在しない」値として区別されるため、その他の値とは異なった挙動をします。

もし今後何かでNULLを扱う際には、この記事を思い出してもらえると非常に嬉しく思います。

エンジニアになりたい人に選ばれるプログラミングスクール「ポテパンキャンプ 」

ポテパンキャンプは卒業生の多くがWebエンジニアとして活躍している実践型プログラミングスクールです。 1000名以上が受講しており、その多くが上場企業、ベンチャー企業のWebエンジニアとして活躍しています。

基礎的な学習だけで満足せず、実際にプログラミングを覚えて実践で使えるレベルまで学習したいという方に人気です。 プログラミングを学習し実践で使うには様々な要素が必要です。

それがマルっと詰まっているポテパンキャンプでプログラミングを学習してみませんか?

卒業生の多くがWebエンジニアとして活躍

卒業生の多くがWeb企業で活躍しております。
実践的なカリキュラムをこなしているからこそ現場でも戦力となっております。
活躍する卒業生のインタビューもございますので是非御覧ください。

経験豊富なエンジニア陣が直接指導

実践的なカリキュラムと経験豊富なエンジニアが直接指導にあたります。
有名企業のエンジニアも多数在籍し品質高いWebアプリケーションを作れるようサポートします。

満足度高くコスパの高いプログラミングスクール「ポテパンキャンプ」

運営する株式会社ポテパンは10,000人以上のエンジニアのキャリアサポートを行ってきております。
そのノウハウを活かして実践的なカリキュラムを随時アップデートしております。

代表の宮崎もプログラミングを覚えサイトを作りポテパンを創業しました。
本気でプログラミングを身につけたいという方にコスパ良く受講していただきたいと思っておりますので、気になる方はぜひスクール詳細をのぞいてくださいませ。