SQL LEFT JOIN -- 左テーブルのすべての行を保持
SQL LEFT JOIN(LEFT OUTER JOIN)を理解します。左テーブルのすべての行を返し、マッチしない右テーブルのカラムにNULLを埋めます。図と例付き。
JOIN Types
詳細な説明
LEFT JOINとは?
LEFT JOIN(LEFT 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;
ステップバイステップの実行
customersのすべての行から開始します。- 各顧客について、
o.customer_id = c.idの条件でordersのマッチする行を検索します。 - 1つ以上のマッチがあれば、各マッチに対して結合行を出力します。
- マッチがない場合、顧客行を出力し、
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を使用します。例えば、注文したことがない顧客を含む、すべての顧客とその最新の注文を一覧表示する場合です。