サブクエリ応用 — 相関サブクエリと FROM 句

中級142

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

データベースを初期化中...
SQL エディタCtrl+Enter で実行
SQL を入力して実行してください
練習問題 — 0/2 完了 (0/60pt)
相関サブクエリを使って、各カテゴリで最も価格の高い商品の name・category・price を取得してください。
30pt
FROM 句のサブクエリを使って、カテゴリごとの平均価格が 30000 より大きいカテゴリと、その平均価格を取得してください。
30pt