サブクエリ — クエリの中のクエリ

中級123

SELECT の中に別の SELECT を入れるサブクエリで、「平均より高い」「◯◯が注文した商品」などの条件を作る方法を練習します。

サブクエリとは

サブクエリ は、 クエリの中に 入れ子にした もう 1 つの SELECT です。

「まず内側で 値を求めて、 それを外側の条件に使う」という 2 段構えを 1 文で書けます。

1 つの値を返すサブクエリ(スカラサブクエリ)

「平均価格より高い商品」を 出したいとします。 平均価格は クエリを打つまで

分からないので、 数値を 直接書けません。 サブクエリで その場で 求めます。

SELECT name, price

FROM products

WHERE price > (SELECT AVG(price) FROM products);

内側の (SELECT AVG(price) FROM products) が 平均価格 1 つを返し、 外側が

「それより高い行」を 選びます。 平均が変わっても クエリは 書き換え不要です。

複数の値を返すサブクエリ(IN)

サブクエリが 複数行を返すときは = ではなく IN で受けます。

-- 田中太郎 (id=1) が注文した「商品」を求める

SELECT name FROM products

WHERE id IN (SELECT product_id FROM orders WHERE customer_id = 1);

内側は 「田中太郎の注文にある product_id の一覧」を返し、 外側は

「その id に一致する商品」を 選びます。

JOIN との使い分け

同じことは JOIN でも書けますが、

- 一覧に他テーブルの列も並べたい → JOIN

- 条件として 使いたいだけ(結果には出さない) → サブクエリ

が すっきりする 目安です。

次のレッスン: サブクエリ応用 — 相関サブクエリと FROM 句

データベースを初期化中...
SQL エディタCtrl+Enter で実行
SQL を入力して実行してください
練習問題 — 0/3 完了 (0/70pt)
products の平均価格より高い商品の name と price を取得してください(サブクエリを使う)。
25pt
「田中太郎」(id = 1) が注文した商品の name を、サブクエリ (IN) を使って取得してください。
25pt
customers の平均年齢より若い顧客の name と age を取得してください(サブクエリを使う)。
20pt