メインコンテンツにスキップ
モジュール 4 · レッスン 2 / 4コース内の 14/57~10 min
モジュールのレッスン (2/4)

NULL の処理: IS NULL と COALESCE

employees データセットでは、アンドレア コスタは特別です。 department_id = NULL。すでに NULL に対してブラシをかけています ( LEFT JOIN) ですが、それを真剣に受け止める時期が来ました: SQL の NULL 他の値とは異なる動作をし、それらを無視することは、 製品コードのバグの主な原因。

NULL はゼロではなく、空の文字列でもありません

NULL は 不明な値/欠落値 を意味します。 0、''、ではありません。 false。それは*「わかりません」*です。これから、驚くべき特性がわかります。 NULL は、それ自身であっても、他のものと等しくありません。

SQL
-- All these expressions return NULL (not true!):
SELECT NULL = NULL;       -- NULL
SELECT NULL = 0;          -- NULL
SELECT NULL <> 'qualcosa'; -- NULL

具体的な結果: WHERE column = NULL は機能しません。必ず使用してください 専用オペレーター IS NULL / IS NOT NULL:

SQL
-- Employees without a department:
SELECT first_name, last_name
FROM   employees
WHERE  department_id IS NULL;

-- Employees WITH a department:
SELECT first_name, last_name
FROM   employees
WHERE  department_id IS NOT NULL;

COALESCE — NULL フォールバック

データが 欠落: 文字列 '(none)'、ゼロ、デフォルトの日付。という機能 正確にこれは COALESCE(a, b, c, ...) です: 最初の リスト内の NULL 以外の引数。

SQL
-- Show the department_id, or 0 if missing:
SELECT first_name, last_name, COALESCE(department_id, 0) AS dept
FROM   employees;

LEFT JOIN と組み合わせると、レポートにとって信じられないほど強力になります。

SQL
SELECT e.first_name,
       e.last_name,
       COALESCE(d.name, '(nessun dipartimento)') AS dipartimento
FROM   employees   AS e
LEFT JOIN departments AS d ON e.department_id = d.id;

結果: すべての従業員が部門名または明示的な情報とともに返されました。 ラベルを持っていない人のためのラベル。

NULL と集計

集計関数 無視 NULLs (COUNT(*) を除く):

  • COUNT(department_id) は、値を持つ行のみをカウントします。
  • AVG(salary) は、NULL を無視して平均します。これらは 0 として扱われません**。
  • SUM(...) は、NULL 以外の値のみを合計します。

これはほとんどの場合、あなたが望むものです。しかし、次のことを知っておくとよいでしょう。 「従業員の総数」 を検索する場合は、COUNT(*) ではなく、COUNT(*) を使用してください。 COUNT(department_id)。

試してみてください

運動#sql.m4.l2.e1
試行回数: 0読み込み中…

すべての従業員について、名 (first_name)、姓 (last_name)、および部門 ID に等しい列「dipartimento_id」、または割り当てられていない場合は -1 を表示します。 3 列、従業員ごとに 1 行。

エディターを読み込み中…
ヒントを表示

COALESCE(Department_id, -1) を使用して、NULL を -1 に置き換えます。

3 回の試行後に解決策が利用可能になります

復習演習

運動#sql.m4.l2.e2
試行回数: 0読み込み中…

すべての従業員の名 (first_name)、姓 (last_name)、および部門名 (Departments.name) を返します。部門が欠落している場合は「(nessuno)」と表示されます。 LEFT JOIN + COALESCE を使用します。

エディターを読み込み中…
ヒントを表示

COALESCE(d.name, '(nessuno)') は、LEFT JOIN によって導入された NULL を処理します。

3 回の試行後に解決策が利用可能になります