MySQL 入門

MySQL におけるNULL値の検索

NULL は SQL における特殊なマーカーであり、欠損しているデータや未知(不明)のデータを表します。これはゼロ(0)や空文字('')とは異なります。「値が全く存在しない」という状態を象徴するものです。NULL 自体は値ではないため、標準的な比較演算子(=<> など)を使用してその存在をチェックすることはできません。代わりに、MySQL では特定の演算子である IS NULLIS NOT NULL が用意されています。

1. データベースにおけるNULLの概念

データベースにおいて、NULL は未知、適用不能、または意図的に空のままにされたデータを表します。これはデータの整合性を維持し、情報のステータスを正確に反映させる上で極めて重要な役割を果たします。

  • 欠損した連絡先: 顧客テーブルにおいて、ある顧客の email_address カラムが NULL である場合、その顧客がまだメールアドレスを提供していないか、あるいは単に不明であることを意味します。これは、彼らのメールアドレスが文字通り空文字であることや '0' であることを意味するわけではありません。
  • 進行中のステータス: 従業員情報を格納するテーブルを例に挙げます。ある従業員が現在も在職中である場合、その従業員の end_date(退職日)は NULL になる可能性があります。この NULL は「継続中の状態」を明確に示しており、具体的な日付のように「終了」をマークすることはありません。
  • 未適用の割引: orders(注文)テーブルの order_discount カラムも一例です。注文に割引が適用されなかった場合、order_discount の値は NULL になります。これは「割引が適用されていない」ことを示します。0% の割引とは異なります。なぜなら、0% は「計算が行われ、結果としてゼロになった」ことを意味するからです。

2. IS NULLによるNULL値のチェック

IS NULL 演算子は WHERE 句で使用され、特定のカラムの値が NULL である行をフィルタリングするために使用されます。この演算子はデータの欠損を明示的にチェックします。

この動作を説明するために、以前のモジュールで紹介した world データベースを使用します。ここでは、世界の都市情報を含む city テーブルに注目します。このテーブルには District(行政区)というカラムがありますが、一部の都市では行政区情報が未知であったり適用不能であったりするため、NULL 値が含まれることがあります。

-- District(行政区)がNULLであるすべての都市を選択
SELECT
    Name,
    CountryCode,
    District
FROM
    city
WHERE
    District IS NULL;

このクエリの内容:

  • SELECT Name, CountryCode, District:取得するカラムを指定します。
  • FROM city:クエリの対象が city テーブルであることを示します。
  • WHERE District IS NULL:フィルタリング条件であり、District カラムに NULL 値を持つ行のみを返します。

都市の分析を行っており、行政区レベルのデータが欠損している都市を特定する必要がある場合(データ入力の漏れ確認やバリデーションなど)、このクエリは非常に有効です。

2.1 IS NULLの実践的なユースケース

employee_idfirst_namelast_nameemailphone_number カラムを持つ employees(従業員)テーブルを想定します。すべての従業員が phone_number(電話番号)を提供しているわけではありません。電話番号が記録されていない従業員を検索するには以下のようになります。

-- 'phone_number' カラムを持つ 'employees' テーブルが存在すると仮定
SELECT
    employee_id,
    first_name,
    last_name,
    email
FROM
    employees
WHERE
    phone_number IS NULL; -- 電話番号が記録されていない従業員を抽出

このクエリは、phone_number フィールドが空であるすべての従業員をリストアップするため、連絡先情報の提供を依頼するなどのフォローアップが可能になります。

3. IS NOT NULLによる非NULL値のチェック

反対に、IS NOT NULL 演算子は、カラムに実際に値が含まれている(NULL ではない)行を取得するために使用されます。特定のフィールドにデータが存在することを保証したい場合に非常に便利です。

city テーブルの例に戻りましょう。District が記録されているすべての都市を確認したい場合は、IS NOT NULL を使用します。

-- DistrictがNULLではないすべての都市を選択
SELECT
    Name,
    CountryCode,
    District
FROM
    city
WHERE
    District IS NOT NULL;

このクエリのフィルタリング条件:

  • WHERE District IS NOT NULLDistrict カラムに NULL 以外の何らかの値がある行のみを返します。つまり、単なる空白ではなく、明確な文字列や数値が存在することを意味します。

このクエリは、詳細な地理分析のために完全な行政区情報を持つ都市を識別するのに役立ちます。

3.1 IS NOT NULLの実践的なユースケース

同じ employees テーブルのシナリオで、記録されたメールアドレスを確実に持っているすべての従業員(重要な全社告知を送信するためなど)を探したい場合は、IS NOT NULL を使用します。

-- 'email' カラムを持つ 'employees' テーブルが存在すると仮定
SELECT
    employee_id,
    first_name,
    last_name,
    email
FROM
    employees
WHERE
    email IS NOT NULL; -- メールアドレスが記録されている従業員を抽出

このクエリにより、メールで連絡可能なすべての従業員を効率的にリストアップでき、告知がターゲットオーディエンスに届くことを確実にします。

4. IS NULL / IS NOT NULLと他の条件の組み合わせ

以前のレッスン(AND、OR、NOTの組み合わせ)で学んだように、IS NULLIS NOT NULL は論理演算子(ANDORNOT)を使用して他の条件と組み合わせることができます。これにより、より複雑で精密なフィルタリングが可能になります。

4.1 示例:与 AND 组合

特定の国(例:'USA')の中で、District 情報が欠損している都市を検索したい場合。

-- 'USA' に位置し、かつ District が NULL の都市を選択
SELECT
    Name,
    CountryCode,
    District
FROM
    city
WHERE
    CountryCode = 'USA' AND District IS NULL;

ここでは、2つの条件(CountryCode = 'USA' かつ District IS NULL)の両方が真である行だけが結果セットに含まれます。

4.2 示例:与 OR 组合

データレビューのために、「行政区情報がない」または「特定の国に属している」都市のいずれかを抽出する必要がある場合。

-- District が NULL 、あるいは CountryCode が 'CHN'(中国)の都市を選択
SELECT
    Name,
    CountryCode,
    District
FROM
    city
WHERE
    District IS NULL OR CountryCode = 'CHN';

このクエリは、国に関わらず行政区データが欠損している都市と、中国のすべての都市(行政区データの有無にかかわらず)を返します。