SQL LEFT JOIN -- 左テーブルのすべての行を保持

SQL LEFT JOIN(LEFT OUTER JOIN)を理解します。左テーブルのすべての行を返し、マッチしない右テーブルのカラムにNULLを埋めます。図と例付き。

JOIN Types

詳細な説明

LEFT JOINとは?

LEFT JOINLEFT OUTER JOINとも記述)は、左テーブルのすべての行と右テーブルのマッチする行を返します。右テーブルにマッチがない場合、右側のカラムはNULLで埋められます。

構文

SELECT c.id, c.name, o.order_date, o.total
FROM customers AS c
LEFT JOIN orders AS o
  ON c.id = o.customer_id;

ステップバイステップの実行

  1. customersのすべての行から開始します。
  2. 各顧客について、o.customer_id = c.idの条件でordersのマッチする行を検索します。
  3. 1つ以上のマッチがあれば、各マッチに対して結合行を出力します。
  4. マッチがない場合、顧客行を出力し、ordersのすべてのカラムにNULLを入れます。

ベン図の解釈

LEFT JOINはベン図の左円全体をハイライトします。共通部分には両テーブルのデータを持つマッチ行が含まれ、左のみの領域には右テーブルに対応するものがない行(右カラムはNULL)が含まれます。

NULL行が語ること

LEFT JOIN結果のNULLで埋められた行は、最も興味深い部分であることが多いです。これらは左テーブルにあるが右テーブルに関連がないレコードを表します。これにより、LEFT JOINは「孤立した」または「欠落した」データを見つけるための基盤となります。

カウントとフィルタリング

注文がある顧客のみをカウントするには、WHERE o.id IS NOT NULLを追加します。注文がない顧客を見つけるには、WHERE o.id IS NULLを追加します。この2番目のパターンはAnti-JOINと呼ばれ、知っておくべき最も重要なSQLパターンの1つです。

LEFT JOIN vs INNER JOIN

重要な違い:INNER JOINはマッチしない左行を破棄しますが、LEFT JOINはそれらを保持します。すべての左行にマッチがある場合、両方とも同じ結果を生成します。

ユースケース

関連データの有無にかかわらず主テーブルのすべてのレコードが必要な場合にLEFT JOINを使用します。例えば、注文したことがない顧客を含む、すべての顧客とその最新の注文を一覧表示する場合です。

試してみる — SQL JOIN Visualizer

フルツールを開く