JOIN(INNER/LEFT/RIGHT/FULL)

4種のJOINの違いを、顧客×注文テーブルの実例で完全マスター。

複数テーブルを結合するJOIN。種類の違いを正確に把握すれば、コード読解問題で迷いません。

白峰 リリ(しょんぼり) 白峰 リリ

JOINっていろんな種類があって、頭こんがらがる…

神楽 モニカ 先生(笑顔) 神楽 モニカ 先生

4種類を整理しましょう。 INNER JOIN・LEFT JOIN・RIGHT JOIN・FULL OUTER JOINよ。

紅林 かえで(普段) 紅林 かえで

INNER は両方に存在する行のみ、LEFT は左側全行+右側マッチ、RIGHT は右全行+左マッチ、FULL は両方の全行(どちらかでも存在すれば)。

-- 顧客テーブル × 注文テーブル
-- 注文がない顧客も含めて全顧客を表示
SELECT
  c.customer_id,
  c.name,
  COUNT(o.order_id) AS order_count,
  COALESCE(SUM(o.amount), 0) AS total_amount
FROM customers c
LEFT JOIN orders o ON c.customer_id = o.customer_id
GROUP BY c.customer_id, c.name
ORDER BY total_amount DESC;
藍沢 しずく(普段) 藍沢 しずく

このクエリ、注文0回の顧客も表示されるんですねぇ?

紅林 かえで(普段) 紅林 かえで

そう、LEFT JOIN だから顧客全員が左側にあり、注文がない場合は右側がNULL。 COUNT(o.order_id) はNULLを数えないので0、 SUM もNULLになるので COALESCE で 0 に置き換え。

白峰 リリ(笑い) 白峰 リリ

要は、INNER JOIN だったら注文してない顧客は消えちゃうってこと?

神楽 モニカ 先生(普段) 神楽 モニカ 先生

その通り。 ON句の条件と、各JOINの『左/右どちらが主か』を確実に読めるようにするのがコツ。

紅林 かえで(普段) 紅林 かえで

パフォーマンス的には INNER < LEFT/RIGHT < FULL の順に重い傾向。 必要な範囲で JOIN タイプを選ぶのが実務的。

藍沢 しずく(普段) 藍沢 しずく

RIGHT JOIN ってあまり見ないですよねぇ。

神楽 モニカ 先生(普段) 神楽 モニカ 先生

実はRIGHTを使う場面って少なくて、テーブルの順序を入れ替えてLEFTで書くことが多いのよ。 結果は同じになるの。

白峰 リリ(笑い) 白峰 リリ

DS検定でも、JOINのタイプを当てる問題が出るって聞いたよ!

紅林 かえで(普段) 紅林 かえで

そう、よく出るのが『片方にしかないキー』のケース。 INNER JOIN なら消える、LEFT JOIN なら左側のキーは残る、というように結果行数が変わる。

確認クイズ

顧客テーブル(10名)と注文テーブル(7名分)があり、注文がない顧客もすべて表示したい。 適切なJOINはどれか。

  1. INNER JOIN
  2. LEFT JOIN(顧客が左)
  3. RIGHT JOIN(顧客が左)
  4. FULL OUTER JOIN
こたえを見る

正解: 2. LEFT JOIN(顧客が左)

LEFT JOIN(顧客が左)。 注文の有無に関わらず全顧客を表示するには、顧客を左側に置いた LEFT JOIN が適切。 INNER JOIN だと注文がない顧客は除外されます。

🔖 この記事の関連書籍

Amazonアソシエイトリンクを含みます。他分野は おすすめ書籍ページ へ。