行ごとに内側の値が変わる相関サブクエリと、サブクエリの結果を 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)のが 相関サブクエリの お約束です。
サブクエリは 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 で売上を出す