今回の課題・得点と最高完了得点をこのブラウザに保存します。SQL入力・実行結果・教材DBへの変更は再読み込みで戻ります。誤答やヒントによる減点はありません。

最高完了得点: 0 / 60pt

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

中級約14分2問

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

教材DBを初期化中...
SQL エディタCtrl / ⌘ + Enter で実行 · Esc → Tab で移動

結果は1000行まで・実行は30秒まで。中止・リセットは教材への変更だけを破棄し、入力SQLと進捗は残します。

教材DBを初期化しています。

SQL を入力して実行してください
練習問題 — 0/2 完了 (0/60pt)
▶
相関サブクエリを使って、各カテゴリで最も価格の高い商品の name・category・price を取得してください。
列の順序: name → category → price。行の順序は自由です。
30pt
○
FROM 句のサブクエリを使って、カテゴリごとの平均価格が 30000 より大きいカテゴリと、その平均価格を取得してください。
30pt