モジュールのレッスン (2/4)
NULL の処理: IS NULL と COALESCE
employees データセットでは、アンドレア コスタは特別です。
department_id = NULL。すでに NULL に対してブラシをかけています (
LEFT JOIN) ですが、それを真剣に受け止める時期が来ました: SQL の NULL
他の値とは異なる動作をし、それらを無視することは、
製品コードのバグの主な原因。
NULL はゼロではなく、空の文字列でもありません
NULL は 不明な値/欠落値 を意味します。 0、''、ではありません。
false。それは*「わかりません」*です。これから、驚くべき特性がわかります。
NULL は、それ自身であっても、他のものと等しくありません。
-- 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:
-- 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 以外の引数。
-- Show the department_id, or 0 if missing:
SELECT first_name, last_name, COALESCE(department_id, 0) AS dept
FROM employees;LEFT JOIN と組み合わせると、レポートにとって信じられないほど強力になります。
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)。
試してみてください
すべての従業員について、名 (first_name)、姓 (last_name)、および部門 ID に等しい列「dipartimento_id」、または割り当てられていない場合は -1 を表示します。 3 列、従業員ごとに 1 行。
ヒントを表示
COALESCE(Department_id, -1) を使用して、NULL を -1 に置き換えます。
3 回の試行後に解決策が利用可能になります
復習演習
すべての従業員の名 (first_name)、姓 (last_name)、および部門名 (Departments.name) を返します。部門が欠落している場合は「(nessuno)」と表示されます。 LEFT JOIN + COALESCE を使用します。
ヒントを表示
COALESCE(d.name, '(nessuno)') は、LEFT JOIN によって導入された NULL を処理します。
3 回の試行後に解決策が利用可能になります