複数テーブルを結合する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はどれか。
- INNER JOIN
- LEFT JOIN(顧客が左)
- RIGHT JOIN(顧客が左)
- FULL OUTER JOIN
こたえを見る
正解: 2. LEFT JOIN(顧客が左)
LEFT JOIN(顧客が左)。 注文の有無に関わらず全顧客を表示するには、顧客を左側に置いた LEFT JOIN が適切。 INNER JOIN だと注文がない顧客は除外されます。