OracleデータベースのNULLを徹底解説

Oracle Master Bronze

Oracleデータベースにおける「NULL」は単なる空欄ではなく、「値が未入力・不明であること」を示す特別な概念です。NULLの扱いを誤ると、正しくデータが取得できなかったり、集計結果にズレが生じたりするため、正しい理解が非常に重要です。

本記事では、SCOTTスキーマのEMP表を用いながら、NULLの本質・具体的なSQL・注意点を丁寧に解説していきます。

💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?

Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?


✅事前準備:SCOTTスキーマとNULLデータの追加

🔸SCOTTスキーマのインストール

以下を実行してサンプルスキーマを導入できます。

SQL> @?/rdbms/admin/utlsampl.sql

🔸EMP表にNULL行を追加

以下のように、給与(SAL列)をNULLにした行を追加します。

INSERT INTO emp (empno, ename, job, mgr, hiredate, sal, deptno)
VALUES (9999, 'NULL_SAL', 'CLERK', 7902, TO_DATE('2024-11-01','YYYY-MM-DD'), NULL, 20);

NULLとは何か? ──「無」ではなく「不明」

OracleでのNULLは、「値が存在するかどうかがわからない状態」です。以下の図のように、「0」や「空文字」とも違います。

┌──────────────┬────────────┐
│ 値の種類 │ 意味 │
├──────────────┼────────────┤
│ 0 │ 数値のゼロ │
│ '' │ 空の文字列 │
│ NULL │ 値が不明 │
└──────────────┴────────────┘

NULLを検索するにはIS NULLが必須

たとえば、給与(sal列)が入力されていない従業員を検索したい場合:

SELECT empno, ename, sal
FROM emp
WHERE sal IS NULL;

📌実行結果(一部抜粋):

EMPNO ENAME     SAL
----- ---------- ----
9999 NULL_SAL

= NULL では検索できません(後述)。


NULLの性質:比較も計算も特別

NULLは通常の値と異なり、比較・計算に特別な性質を持ちます。

🔸 NULL = NULL は false?

実は違います。Oracleでは以下のように評価されます:

  • NULL = NULL ⇒ 「不明」
  • NULL != NULL ⇒ 「不明」
  • NULL + 100NULL

このため、以下のようなSQLは成立しません。

SELECT empno, ename
FROM emp
WHERE sal = NULL; -- 誤り

代わりに、正しい書き方はこうです:

SELECT empno, ename
FROM emp
WHERE sal IS NULL;

💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?

Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?


NULLとIS NOT NULL

給与が設定されている従業員のみを抽出したい場合:

SELECT empno, ename, sal
FROM emp
WHERE sal IS NOT NULL;

このクエリでは、給与がNULLでない従業員だけが対象になります。


NULLとLIKEは相性が悪い?

はい、NULLは文字列とはみなされないため、LIKEではマッチしません。

SELECT empno, ename
FROM emp
WHERE ename LIKE 'A%';

この場合、enameがNULLの行は無視されます。


NULLを含む計算に要注意!

数値型の列に対して演算を行う際、NULLが含まれると結果もNULLになります。

SELECT empno, ename, sal, sal + 100 AS sal_with_bonus
FROM emp;

📌結果例:

EMPNO ENAME     SAL   SAL_WITH_BONUS
----- ---------- ----- ---------------
9999 NULL_SAL NULL

つまり、ボーナス加算などのロジックでは、NULLの存在を必ず意識すべきです。


並び替え時のNULLの位置を制御する方法

Oracleでは、ORDER BYでNULLを先頭または末尾に明示的に配置できます。

🔸NULLを先頭に表示する

SELECT empno, ename, sal
FROM emp
ORDER BY sal NULLS FIRST;
NULL_SAL が一番上に来る

🔸NULLを最後に表示する

SELECT empno, ename, sal
FROM emp
ORDER BY sal NULLS LAST;

NULLの位置を調整することで、分析レポートの見やすさが向上します。


集計関数におけるNULLの影響

たとえば、部門ごとの給与設定人数をカウントする場合:

SELECT deptno, COUNT(sal) AS num_of_employees
FROM emp
GROUP BY deptno;

📌ポイント:

  • COUNT(sal) は NULL を含まない
  • COUNT(*) は NULL を含む
DEPTNO NUM_OF_EMPLOYEES
------- ----------------
10 3
20 3
30 6

WHERE句におけるNULLのトリック

たとえば、給与が「0」の従業員を検索するクエリ:

SELECT empno, ename, sal
FROM emp
WHERE sal = 0;

このクエリでは、給与がNULLの従業員は除外されます。

🔸NULLも含めて検索したい場合:

SELECT empno, ename, sal
FROM emp
WHERE sal = 0 OR sal IS NULL;

NULLを扱う際は、明示的に IS NULL を併用する必要があります。


✅まとめ:NULLは「不明な値」として正しく扱おう

┌────────────────────────┐
│ NULLは以下のように扱おう! │
├────────────────────────┤
│ ・比較は IS NULL / IS NOT NULL を使う │
│ ・演算に含まれると結果もNULLになる │
│ ・集計関数で意図せず除外されることがある │
│ ・並び順制御で NULLS FIRST/LAST を活用 │
└────────────────────────┘

NULLは単なる“空欄”ではなく、データベース上の意味を持つ「不明値」です。扱いを正しく理解することで、検索ミスや集計エラーを防ぎ、信頼性の高いSQLを書くことができます。

ぜひSCOTTスキーマで実際に操作しながら、NULLの理解を深めてみてください!

[参考]
SQL言語リファレンス – NULL

💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?

Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?

コメント

タイトルとURLをコピーしました