INNER JOINは、指定された条件に基づいて結合された両方のテーブルで一致が見つかったレコードのみを返します。OUTER JOIN(LEFT、RIGHT、FULL)を使用すると、結果には、一方または両方のテーブルからすべての行が含まれ、他方のテーブルに一致がなくても含まれます。
どのJOINを使用するか:
例:
-- INNER JOIN SELECT u.id, u.name, o.amount FROM users u INNER JOIN orders o ON u.id = o.user_id; -- LEFT OUTER JOIN SELECT u.id, u.name, o.amount FROM users u LEFT JOIN orders o ON u.id = o.user_id; -- FULL OUTER JOIN SELECT u.id, o.order_id FROM users u FULL OUTER JOIN orders o ON u.id = o.user_id;
右テーブルが空の場合、LEFT JOINはどのような結果を返しますか?
よくある答え: "LEFT JOINは一致がないため空の結果を返す"。正解: LEFT JOINは、左テーブルのすべての行を常に返し、右テーブルの列はNULLになります。
例:
-- usersテーブルにレコードがあり、ordersは空 SELECT u.id, u.name, o.amount FROM users u LEFT JOIN orders o ON u.id=o.user_id; -- 結果: すべてのユーザー、o.amount = NULL
物語
販売分析プロジェクト。顧客とその注文の完全なリストを出力するためにINNER JOINを使用し、注文のない顧客をスキップしました。その結果、レポートから "重要な" 顧客が失われました。解決法: LEFT JOINを使用する。
物語
従業員と部門の管理プラットフォーム。LEFT JOINの代わりにRIGHT JOINを使用したため、新しい部門を追加する際に混乱が生じ、一部の従業員がレポートに表示されなくなりました。理由: 結合の順序が逆になっていました。
物語
データスキーマの移行。変更後、一つのJOINが結合条件の誤記によりCROSS JOINに変わりました。その結果、選択されるデータ量が急増し、データが "膨張" しました。結論: 結合時には常にONを指定し、JOINのタイプを慎重に確認してください。