モジュールのレッスン (2/4)
すべてを左側に維持する: LEFT JOIN
前のレッスンの INNER JOIN には重要な副作用があります。
一致しない行を削除します。従業員に部門がない場合
(department_id は NULL)、それらは結果から消えます。
時々それがあなたが望むことです。しかし、多くの場合、人事報告書ではそうではありません。
部門を持たない従業員も含めて、全員 の従業員を見ることが不可欠です。
そして彼らが誰であるかを知ってください。これが LEFT JOIN の目的です (完全には LEFT OUTER JOIN)。
仕組み
SELECT columns
FROM table_a
LEFT JOIN table_b ON table_a.x = table_b.y;英語で読む: "table_a の すべて 行を保持し、各行について次のことを試みます。
table_b から行を添付します。一致するものがない場合は、次の列を埋めます。
table_b と NULL"。
キーワードは LEFT です。これは「左のテーブル」、つまり書かれたテーブルを意味します。
FROM 以降。その行はすべて常に存続します。
-- All employees, including those without a department:
SELECT e.first_name,
e.last_name,
d.name AS dipartimento
FROM employees AS e
LEFT JOIN departments AS d ON e.department_id = d.id;このデータセットでは、このクエリは 10 行 (それぞれ 1 人の従業員) を返します。アンドレア
department_id = NULL を持つコスタは、dipartimento = NULL とともに登場します
消える代わりに。
「一致しない」行の検索
非常に有益な結果: の列を IS NULL でフィルタリングすることにより、
右側のテーブルでは、一致しない行が正確に見つかります。
-- Orphan employees: no department assigned
SELECT e.first_name, e.last_name
FROM employees AS e
LEFT JOIN departments AS d ON e.department_id = d.id
WHERE d.id IS NULL;このトリックは現実の世界で常に使用されています: 「注文なしで注文を見つけてください」 顧客「, 」レビューのない製品「, 」一度もログインしたことがないユーザー 「」で。
試してみてください
部門が割り当てられていない従業員の名 (first_name) と姓 (last_name) を返します。 1 行以上、2 列。
ヒントを表示
WHERE に d.id IS NULL を入力します。LEFT JOIN で一致する部門が見つからなかった行が必要です。
3 回の試行後に解決策が利用可能になります
復習演習
すべての部門 (部門名) をリストし、その隣に従業員の数を表示します (従業員がいない部門も含めます) (それらの部門には 0 を表示します)。ヒント: 部門から開始して従業員と LEFT JOIN を実行し、次に GROUP BY + COUNT を実行します。
ヒントを表示
一致しない場合に 0 をカウントするには、COUNT(*) ではなく COUNT(e.id) を使用します。LEFT JOIN 行が NULL であるため、COUNT(*) は 1 とカウントします。
3 回の試行後に解決策が利用可能になります