データベース設計 / 約20分
サブクエリ: SQLの中にSQLを入れる
なぜこれを学ぶか
「平均より高い商品だけを取り出したい」——この条件、WHERE に直接 AVG() は書けません。サブクエリ(副問い合わせ)で解決するパターンは実務で頻出です。
サブクエリ とは、SQLの中に書いた別のSELECT文のことです。WHERE amount > (SELECT AVG(amount) FROM orders) のように、括弧の中にSELECTを書きます。
WHERE に集計関数(AVG・SUM など)を直接書けない理由: WHERE は行を1行ずつ評価しますが、AVG は全行をまとめて計算するため、評価のタイミングが合いません。HAVING も使えますが、サブクエリの方が柔軟に使えます。
サブクエリは スカラーサブクエリ(1値を返す)と テーブルサブクエリ(複数行を返し IN 句などで使う)の2種類があります。WHERE id IN (SELECT id FROM ...) もよく使うパターンです。
パフォーマンス: サブクエリは毎行評価されることがあるため、大きなテーブルでは遅くなることがあります。同じ結果をJOINで書けることが多く、JOINのほうが高速な場合があります。まず動くクエリを書き、必要に応じて最適化しましょう。
重要ポイント
- WHERE 節の中に
(SELECT ...)で計算結果を使える - スカラーサブクエリ(1値)と IN 用サブクエリ(複数値)の2パターン
- 大きなテーブルでは JOIN の書き換えを検討する
理解度チェック
選ぶと即座に解説が表示されます。
`WHERE price > (SELECT AVG(price) FROM products)` はどんな行を取り出す?
ヒントを見る
サブクエリ部分 `(SELECT AVG(price) FROM products)` は何を返しますか?
SQL演習ブラウザ内SQLite
orders テーブルから「平均注文金額より高い注文」を取り出してください。要件: ①列は id, user_id, amount ②金額の大きい順 ③サブクエリ(`WHERE amount > (SELECT AVG(amount) ...)`)を使うこと。
テーブル定義と初期データを見る
CREATE TABLE orders (id INTEGER PRIMARY KEY, user_id INTEGER, amount INTEGER);INSERT INTO orders VALUES (1, 1, 3000), (2, 2, 1500), (3, 3, 5000), (4, 1, 2000), (5, 2, 4000), (6, 3, 800);スキルセルフチェック
このレッスンの内容をどの程度理解できましたか?