英語607877 views
中学数学621382 views
りんご192546 views
いろは2986023 views
小学理科717236 views
小学社会308636 views
Computer365120 views
中学社会667106 views
高校生物549842 views
高校倫理1433119 views
Help
Tools

English

サブクエリで別のクエリ結果を条件に使う

サブクエリは、クエリの中に別のクエリを埋め込む書き方です。あるクエリの結果を別のクエリの条件として使いたいときに便利です。

基本的な考え方

サブクエリは括弧で囲んで書きます。内側のクエリが先に実行され、その結果が外側のクエリで使われます。

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 のほうがパフォーマンスがよいこともあります。