SELECT の中に別の SELECT を入れるサブクエリで、「平均より高い」「◯◯が注文した商品」などの条件を作る方法を練習します。
サブクエリ は、 クエリの中に 入れ子にした もう 1 つの SELECT です。
「まず内側で 値を求めて、 それを外側の条件に使う」という 2 段構えを 1 文で書けます。
「平均価格より高い商品」を 出したいとします。 平均価格は クエリを打つまで
分からないので、 数値を 直接書けません。 サブクエリで その場で 求めます。
SELECT name, price
FROM products
WHERE price > (SELECT AVG(price) FROM products);
内側の (SELECT AVG(price) FROM products) が 平均価格 1 つを返し、 外側が
「それより高い行」を 選びます。 平均が変わっても クエリは 書き換え不要です。
サブクエリが 複数行を返すときは = ではなく IN で受けます。
-- 田中太郎 (id=1) が注文した「商品」を求める
SELECT name FROM products
WHERE id IN (SELECT product_id FROM orders WHERE customer_id = 1);
内側は 「田中太郎の注文にある product_id の一覧」を返し、 外側は
「その id に一致する商品」を 選びます。
同じことは JOIN でも書けますが、
- 一覧に他テーブルの列も並べたい → JOIN
- 条件として 使いたいだけ(結果には出さない) → サブクエリ
が すっきりする 目安です。
次のレッスン: サブクエリ応用 — 相関サブクエリと FROM 句