こんにちは、阿久梨絵です!
SQL でデータを結合するときに使う JOIN には、INNER JOIN と OUTER JOIN の2種類があります。
どちらもテーブルを組み合わせるための重要な機能ですが、適切に使わないと 意図しないデータ欠損 や パフォーマンス低下 を引き起こすことがあります。
・INNER JOIN → 両方のテーブルに共通するデータのみ取得
・OUTER JOIN → 片方にデータがなくても結合を維持
INNER JOINの特徴と注意点
INNER JOIN は、結合キーの一致するデータのみを抽出するため、共通するレコードだけが結果に含まれます。
SELECT customers.customer_name, orders.order_id
FROM customers
INNER JOIN orders ON customers.customer_id = orders.customer_id;
このクエリの注意点
・INNER JOIN は、両方のテーブルに一致するデータがない場合、結果はゼロになる
・存在しないデータが切り捨てられるため、予期しない欠損が発生することがある
例えば、購入履歴がない顧客を含めたいなら、INNER JOINではなくOUTER JOINを使う必要がある。
OUTER JOINの種類と注意点
OUTER JOIN には LEFT JOIN、RIGHT JOIN、FULL JOIN の3種類があります。
LEFT JOIN(左のテーブルのデータをすべて保持)
SELECT customers.customer_name, orders.order_id
FROM customers
LEFT JOIN orders ON customers.customer_id = orders.customer_id;
特徴
・顧客情報はすべて残る(注文がない場合はNULL)
・購入履歴がない顧客もデータとして取得可能
RIGHT JOIN(右のテーブルのデータをすべて保持)
SELECT customers.customer_name, orders.order_id
FROM customers
RIGHT JOIN orders ON customers.customer_id = orders.customer_id;
特徴
・注文情報はすべて残る(顧客情報がない場合はNULL)
・存在しない顧客のデータが含まれる可能性あり
FULL JOIN(両方のテーブルのデータをすべて保持)
SELECT customers.customer_name, orders.order_id
FROM customers
FULL JOIN orders ON customers.customer_id = orders.customer_id;
特徴
・顧客情報も注文情報もすべて保持
・NULL値の扱いが重要になる
どのJOINを使うかによって、取得できるデータの範囲が変わるため注意!
JOINの落とし穴と対策
1. NULLの扱いを意識する
OUTER JOINを使うと、片方のテーブルにデータがない場合 NULL が出るため、COALESCE() を使ってデフォルト値を設定 するのが有効。
SELECT customers.customer_name, COALESCE(orders.order_id, ‘未注文’)
FROM customers
LEFT JOIN orders ON customers.customer_id = orders.customer_id;
2. JOINの種類を誤るとデータ欠損が発生
・INNER JOINを使うと、対応するデータがないと結果がゼロになる
・LEFT JOINなら片方のデータを確保できるが、NULL の処理が必要
3. パフォーマンスの問題
・JOINは大量のデータを扱うと処理が遅くなるため、INDEXを適切に設定 し、検索速度を向上させることが重要。
まとめ
・INNER JOIN → 共通データのみ取得。データ欠損に注意!
・OUTER JOIN → 片方のデータがない場合も結果を維持。NULLの扱いを工夫することが重要
・LEFT JOIN / RIGHT JOIN / FULL JOIN → 用途に応じて使い分けが必要
・NULL を適切に処理するため COALESCE() を活用
・パフォーマンス改善のために INDEX を活用
SQL のJOINの正しい使い分けを理解し、データ欠損やパフォーマンス低下を防ぎながら、最適なクエリを構築しましょう。
阿久梨絵でした!