IS NULL / IS NOT NULL
| 対応: | SQL-92(1992) |
|---|
列の値がNULL(値が存在しない状態)かどうかを判定する演算子です。NULLは特殊な値のため、通常の比較演算子では判定できません。
構文
値がNULLの行を取得します。
SELECT column_name FROM table_name WHERE column_name IS NULL;
値がNULLでない行を取得します。
SELECT column_name FROM table_name WHERE column_name IS NOT NULL;
構文一覧
| 構文 | 概要 |
|---|---|
| IS NULL | 列の値がNULLの行を取得します。NULLとは値が未設定・不明であることを示す特殊な状態です。 |
| IS NOT NULL | 列の値がNULLでない行を取得します。 |
サンプルコード
以下の『employees』テーブルを例に説明します。
退職日が未設定(NULLの)社員を取得します(現在の在籍社員)。
sample_is_null.sql
SELECT name, hire_date FROM employees WHERE retire_date IS NULL;
+----------+------------+ | name | hire_date | +----------+------------+ | 綾波レイ | 2018-04-01 | | 碇シンジ | 2020-07-15 | | 渚カヲル | 2022-01-10 | +----------+------------+ 3 rows in set
退職日が設定済みの社員を取得します(退職者一覧)。
sample_is_null.sql
SELECT name, hire_date, retire_date FROM employees WHERE retire_date IS NOT NULL;
+------------+------------+-------------+ | name | hire_date | retire_date | +------------+------------+-------------+ | 惣流アスカ | 2015-09-01 | 2023-03-31 | +------------+------------+-------------+ 1 row in set
ボーナスが未設定の社員を確認します。
sample_is_null.sql
SELECT name FROM employees WHERE bonus IS NULL;
+------------+ | name | +------------+ | 渚カヲル | | 惣流アスカ | +------------+ 2 rows in set
NULLを含む列の集計では挙動に注意が必要です。『COUNT(*)』はNULLを含む全行を数えますが、『COUNT(列名)』はNULLを除いて数えます。
sample_is_null.sql
SELECT COUNT(*) AS total_count, COUNT(bonus) AS bonus_count FROM employees;
+-------------+-------------+ | total_count | bonus_count | +-------------+-------------+ | 4 | 2 | +-------------+-------------+ 1 row in set
NULLの場合に代替値を返す『IFNULL』(MySQL)の例です。
sample_is_null.sql
SELECT name, IFNULL(bonus, 0) AS bonus FROM employees;
+------------+-------+ | name | bonus | +------------+-------+ | 綾波レイ | 50000 | | 碇シンジ | 30000 | | 渚カヲル | 0 | | 惣流アスカ | 0 | +------------+-------+ 4 rows in set
データベース別の書き方
『IS NULL』『IS NOT NULL』の構文は主要なデータベースで共通して使用できます。
SELECT name, hire_date FROM employees WHERE retire_date IS NULL;
NULLを代替値に置き換える関数はデータベースごとに異なります。標準SQLの『COALESCE』はすべてのデータベースで使用できます。
-- 標準SQL(全データベースで使用可能) SELECT name, COALESCE(bonus, 0) AS bonus FROM employees;
MySQL では『IFNULL』という独自関数も使用できます。
-- MySQL独自 SELECT name, IFNULL(bonus, 0) AS bonus FROM employees;
概要
SQLにおけるNULLは「値が存在しない」「不明」を表す特殊な状態です。NULLは0でも空文字でもないため、通常の比較演算子(=、<> など)での判定はすべてFALSEになります。
『WHERE 列名 = NULL』はNULLを取得できません。必ず『IS NULL』を使用してください。同様に『WHERE 列名 != NULL』も正しく動作しないため、『IS NOT NULL』を使用してください。
NULLを含む算術演算(例:『salary + bonus』でbonusがNULLの場合)は結果もNULLになります。NULLを0などの値に置き換えて計算したい場合は、MySQLでは『IFNULL(列名, 代替値)』、標準SQLでは『COALESCE(列名, 代替値)』を使用します。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。