Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
IS NULL / IS NOT NULL
列の値がNULL(値が存在しない状態)かどうかを判定する演算子です。NULLは特殊な値のため、通常の比較演算子では判定できません。
構文
-- 値がNULLの行を取得します。 SELECT 列名 FROM テーブル名 WHERE 列名 IS NULL; -- 値がNULLでない行を取得します。 SELECT 列名 FROM テーブル名 WHERE 列名 IS NOT NULL;
構文一覧
| 構文 | 概要 |
|---|---|
| IS NULL | 列の値がNULLの行を取得します。NULLとは値が未設定・不明であることを示す特殊な状態です。 |
| IS NOT NULL | 列の値がNULLでない行を取得します。 |
サンプルコード
-- 退職日が未設定(NULLの)社員を取得します(現在の在籍社員)。 SELECT name, hire_date FROM employees WHERE retire_date IS NULL; -- 退職日が設定済みの社員を取得します(退職者一覧)。 SELECT name, hire_date, retire_date FROM employees WHERE retire_date IS NOT NULL; -- 部署が未設定の社員を確認します。 SELECT name FROM employees WHERE department IS NULL; -- NULLを含む列の集計では挙動に注意が必要です。 -- COUNT(*)はNULLを含む全行を数えますが、COUNT(列名)はNULLを除いて数えます。 SELECT COUNT(*) AS 全件数, COUNT(bonus) AS ボーナス設定件数 FROM employees; -- NULLの場合に代替値を返すIFNULL(MySQL)の例です。 SELECT name, IFNULL(bonus, 0) AS ボーナス FROM employees;
実行結果
-- SELECT name, hire_date FROM employees WHERE retire_date IS NULL; の結果例 -- +----------+------------+ -- | name | hire_date | -- +----------+------------+ -- | 田中太郎 | 2018-04-01 | -- | 鈴木花子 | 2020-07-15 | -- | 山田次郎 | 2022-01-10 | -- +----------+------------+
データベース別の書き方
『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 ボーナス FROM employees;
MySQL では『IFNULL』、Oracle では『NVL』という独自関数も使用できます。
-- MySQL独自 SELECT name, IFNULL(bonus, 0) AS ボーナス FROM employees; -- Oracle独自 SELECT name, NVL(bonus, 0) AS ボーナス 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(列名, 代替値)』を使用します。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。