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

すべてを左側に維持する: LEFT JOIN

前のレッスンの INNER JOIN には重要な副作用があります。 一致しない行を削除します。従業員に部門がない場合 (department_id は NULL)、それらは結果から消えます。

時々それがあなたが望むことです。しかし、多くの場合、人事報告書ではそうではありません。 部門を持たない従業員も含めて、全員 の従業員を見ることが不可欠です。 そして彼らが誰であるかを知ってください。これが LEFT JOIN の目的です (完全には LEFT OUTER JOIN)。

仕組み

SQL
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 以降。その行はすべて常に存続します。

SQL
-- 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 でフィルタリングすることにより、 右側のテーブルでは、一致しない行が正確に見つかります。

SQL
-- 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;

このトリックは現実の世界で常に使用されています: 「注文なしで注文を見つけてください」 顧客「, 」レビューのない製品「, 」一度もログインしたことがないユーザー 「」で。

試してみてください

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

部門が割り当てられていない従業員の名 (first_name) と姓 (last_name) を返します。 1 行以上、2 列。

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

WHERE に d.id IS NULL を入力します。LEFT JOIN で一致する部門が見つからなかった行が必要です。

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

復習演習

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

すべての部門 (部門名) をリストし、その隣に従業員の数を表示します (従業員がいない部門も含めます) (それらの部門には 0 を表示します)。ヒント: 部門から開始して従業員と LEFT JOIN を実行し、次に GROUP BY + COUNT を実行します。

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

一致しない場合に 0 をカウントするには、COUNT(*) ではなく COUNT(e.id) を使用します。LEFT JOIN 行が NULL であるため、COUNT(*) は 1 とカウントします。

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