問題 1
全商品の平均価格より高い商品のnameとpriceを取得してください
📖 解説参考資料
サブクエリとは?
SQL文の中に別のSQL文を埋め込む技術です。括弧で囲んで記述します。「まず内側のクエリを実行し、その結果を外側のクエリで使う」というイメージです。
▼ サブクエリの実行イメージ
SELECT name, price FROM products
WHERE price > (SELECT AVG(price) FROM products)
WHERE price > (SELECT AVG(price) FROM products)
① 内側: AVG(price) = 46,900円 を計算
→
② 外側: price > 46,900 の商品を取得
WHERE句のサブクエリ
集計結果と比較したいときに便利です。「平均より高い商品」「最大値と同じ商品」などが一発で書けます。
SELECT name, price
FROM products
WHERE price > (
SELECT AVG(price) FROM products
);
INを使ったサブクエリ
「別テーブルの条件を満たす行のIDリストを使って絞り込む」パターンです。JOINでも同じ結果が得られますが、直感的に書きやすい場面があります。
SELECT * FROM orders
WHERE user_id IN (
SELECT id FROM users WHERE city = '東京'
);
⚠️ よくあるミス:サブクエリが複数行を返す場合
WHERE price = (SELECT price FROM products WHERE ...) のように、サブクエリが複数行を返す可能性がある場合は = の代わりに IN を使いましょう。= は1行しか受け取れないためエラーになります。
FROM句のサブクエリ(派生テーブル)
一度集計した結果をさらに絞り込みたいときに使います。「平均価格が2万円以上のカテゴリ」のように、集計後の値に条件をつける場合は HAVING ではなくこちらが有効なケースもあります。
SELECT cat.category, cat.avg_price
FROM (
SELECT category, AVG(price) AS avg_price
FROM products
GROUP BY category
) cat
WHERE cat.avg_price > 20000;
💼 実務での使いどころ
「全体平均より売上が高い営業担当者を抽出する」「先月より購入金額が増えたユーザーを特定する」など、比較・ランキング系の分析クエリでサブクエリは欠かせません。慣れると複雑な分析も1クエリで書けるようになります。
「全体平均より売上が高い営業担当者を抽出する」「先月より購入金額が増えたユーザーを特定する」など、比較・ランキング系の分析クエリでサブクエリは欠かせません。慣れると複雑な分析も1クエリで書けるようになります。