サブクエリで別のクエリ結果を条件に使う
サブクエリは、クエリの中に別のクエリを埋め込む書き方です。あるクエリの結果を別のクエリの条件として使いたいときに便利です。
基本的な考え方
サブクエリは括弧で囲んで書きます。内側のクエリが先に実行され、その結果が外側のクエリで使われます。
SELECT * FROM テーブル
WHERE カラム = (サブクエリ);具体例:単一の値を返すサブクエリ
平均年齢より上のユーザーを取得するには、こう書きます。
SELECT * FROM users
WHERE age > (SELECT AVG(age) FROM users);内側の SELECT AVG(age) FROM users がまず実行され、その結果(たとえば 28.5)が外側の条件に使われます。
サブクエリが返す値の種類
サブクエリが返す値によって、使える演算子が変わります。
| 返す値 | 使える演算子 |
|---|---|
| 単一の値(スカラー) | =, <>, <, >, など |
| 複数の値(リスト) | IN, NOT IN |
| テーブル(複数行・複数列) | EXISTS, FROM句で使用 |
IN と組み合わせる
サブクエリが複数の値を返す場合は IN を使います。
-- 注文したことがあるユーザー
SELECT * FROM users
WHERE id IN (SELECT DISTINCT user_id FROM orders);サブクエリが複数の user_id を返し、users.id がそのどれかに一致する行を取得します。
WHERE 句以外でも使える
サブクエリは SELECT 句や FROM 句でも使えます。
-- SELECT 句でサブクエリ
SELECT
name,
(SELECT COUNT(*) FROM orders WHERE orders.user_id = users.id) AS order_count
FROM users;この場合、users の各行に対してサブクエリが実行されます。
-- FROM 句でサブクエリ(派生テーブル)
SELECT * FROM (
SELECT city, COUNT(*) AS user_count
FROM users
GROUP BY city
) AS city_stats
WHERE user_count >= 10;FROM 句でサブクエリを使う場合は、必ず別名(AS city_stats)をつける必要があります。
相関サブクエリ
外側のクエリのカラムを内側で参照するサブクエリを、相関サブクエリと呼びます。
SELECT * FROM users u
WHERE age > (
SELECT AVG(age) FROM users WHERE city = u.city
);この例では、各ユーザーの年齢を「同じ都市の平均年齢」と比較しています。u.city が外側のクエリを参照しているのがポイントです。
非相関サブクエリ
内側のクエリが 1 回だけ実行される
相関サブクエリ
外側の各行に対して内側が実行される(遅くなりがち)
サブクエリは強力ですが、複雑になりがちです。JOIN で書けるなら JOIN のほうがパフォーマンスがよいこともあります。











