今回の課題・得点と最高完了得点をこのブラウザに保存します。SQL入力・実行結果・教材DBへの変更は再読み込みで戻ります。誤答やヒントによる減点はありません。
最高完了得点: 0 / 60pt
サブクエリ応用 — 相関サブクエリと FROM 句
行ごとに内側の値が変わる相関サブクエリと、サブクエリの結果を 1 つのテーブルとして扱う FROM 句サブクエリを練習します。
相関サブクエリ
前回のサブクエリは、内側が 1 回だけ計算されました。 相関サブクエリ は、
外側の各行に合わせて内側が その都度 計算されるサブクエリです。
「各カテゴリの中で最も高い商品」を出してみましょう。
SELECT name, category, price
FROM products p1
WHERE price = (
SELECT MAX(price) FROM products p2
WHERE p2.category = p1.category
);
内側の p2.category = p1.category がポイントです。外側の 1 行 (p1) の
カテゴリに合わせて、内側が「そのカテゴリの最高値」を計算し直します。
だからカテゴリごとの最高値商品がそれぞれ取れます。
外側と内側で 別名を分ける(p1 / p2)のが相関サブクエリのお約束です。
FROM 句のサブクエリ(導出テーブル)
サブクエリは WHERE だけでなく FROM にも置けます。サブクエリの結果を
「その場の一時テーブル」として扱う書き方です。
SELECT category, avg_p
FROM (
SELECT category, AVG(price) AS avg_p
FROM products
GROUP BY category
)
WHERE avg_p > 30000;
内側で「カテゴリごとの平均価格」を作り、外側で「平均が 3 万円を超えるカテゴリ」
だけに絞っています。集計した結果をさらに絞り込みたいときに使います。
(同じことは HAVING でも書けますが、集計結果を何度も参照したりさらに JOIN
したいときは FROM 句サブクエリが便利です。)
次のレッスン: 総合 — JOIN × GROUP BY で売上を出す
結果は1000行まで・実行は30秒まで。中止・リセットは教材への変更だけを破棄し、入力SQLと進捗は残します。
教材DBを初期化しています。