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 + 100⇒NULL
このため、以下のような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専門のエージェントで非公開求人をチェックしてみませんか?




コメント