更新:
サブクエリ vs JOIN どちらを使うべきか【SQL中級】
サブクエリとは
サブクエリとは、クエリの中に別のクエリを入れ子にしたものです。括弧 () の中にSELECT文を書きます。
-- 平均給与より高い給与の社員を取得
SELECT name, salary
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);同じ結果をJOINで書く
-- 注文したことがある顧客を取得(サブクエリ版)
SELECT name FROM customers
WHERE id IN (SELECT customer_id FROM orders);
-- JOINで書く
SELECT DISTINCT c.name
FROM customers c
INNER JOIN orders o ON c.id = o.customer_id;サブクエリが向いているケース
- 集計結果との比較:AVG・MAX・MINなどの集計値と比較する場合
- EXISTS句:「〜が存在するかどうか」を確認する場合
- 可読性が高い場合
-- 一度も注文していない顧客を取得(NOT EXISTS)
SELECT name FROM customers c
WHERE NOT EXISTS (
SELECT 1 FROM orders o WHERE o.customer_id = c.id
);JOINが向いているケース
- 複数のカラムを結合テーブルから取得する場合
- パフォーマンスが求められる場合
- 外部キーで結びついたテーブルを扱う場合
パフォーマンスの観点
一般的にサブクエリは行ごとに繰り返し実行される場合があり、大量データでは遅くなることがあります。JOINはデータベースが最適化しやすくインデックスを活用できます。
ただし現代のPostgreSQLはサブクエリも最適化するため、少量データであれば体感差はほぼありません。まずは可読性を優先して書き、遅い場合にJOINへの書き換えを検討しましょう。
使い分けの結論
- 集計値との比較・EXISTSチェック → サブクエリ
- 別テーブルのカラムを取得したい → JOIN
- 迷ったら読みやすい方を選ぶ
