データベースを扱っていると、「特定の条件に合うデータを抽出したい!」という場面がよくありますよね。
そんなときに便利なのが 副問い合わせ(サブクエリ) です。
今回は、副問い合わせの基本から使い方まで、わかりやすく解説していきます!
1. 副問い合わせ(サブクエリ)とは?
副問い合わせ(サブクエリ)とは、 SQLの中で「別のSELECT文の結果」を利用すること です。
簡単に言うと、「あるSELECT文の結果を使って、別のSELECT文を実行する」仕組みです。
例えば、次のようなケースを考えてみましょう。
この場合、
- 
「全体の平均売上を求める」SELECT文 を作る
 - 
その結果を メインのSELECT文 で使用する
 
こうすることで、求めるデータを取得できます!
2. 副問い合わせの基本構文
副問い合わせは、 WHERE句・SELECT句・FROM句などで使うことができます。
基本的な書き方は以下のとおりです。
SELECT 列名
FROM テーブル名
WHERE 列名 比較演算子 (副問い合わせ);
副問い合わせの結果が単一の値なら = を使い、複数の値を返す場合は IN を使用します。
3. 副問い合わせの実例
例1:売上が平均より高い商品を取得
まず、以下のような sales テーブルがあるとします。
+----+--------+------+
| id | 商品名 | 売上 |
+----+--------+------+
|  1 | 商品A  | 5000 |
|  2 | 商品B  |12000 |
|  3 | 商品C  | 8000 |
|  4 | 商品D  |15000 |
+----+--------+------+
このデータから、 売上が全体の平均より高い商品 を取得する場合、次のように副問い合わせを使います。
SELECT 商品名, 売上
FROM sales
WHERE 売上 > (SELECT AVG(売上) FROM sales);
どう動く?
- 
(SELECT AVG(売上) FROM sales) で 全体の平均売上 を取得
 - 
その結果を WHERE の条件に使い、平均より高い売上の商品 を取得
 
4. 副問い合わせの種類
副問い合わせには 3つの種類 があります。
① スカラーサブクエリ(単一の値を返す)
副問い合わせの結果が 1つの値(1行1列) になる場合。
最も高い売上を持つ商品の取得
SELECT 商品名, 売上
FROM sales
WHERE 売上 = (SELECT MAX(売上) FROM sales);
② テーブルサブクエリ(複数の値を返す)
副問い合わせの結果が 複数の行になる 場合。
・売上が5000円以上の商品IDを持つ注文データを取得
まず、以下の orders テーブルがあるとします。
+----+------------+------+
| id | product_id | 注文数 |
+----+------------+------+
|  1 |     1      |   2   |
|  2 |     2      |   1   |
|  3 |     3      |   5   |
|  4 |     4      |   3   |
+----+------------+------+
このテーブルから、売上が5000円以上の商品に関する注文を取得する場合、以下のSQLを実行します。
SELECT *
FROM orders
WHERE product_id IN (SELECT id FROM sales WHERE 売上 >= 5000);
相関サブクエリ(メインのクエリと関連する)
副問い合わせが メインのクエリのデータごとに実行される もの。
・各商品の売上が、その商品カテゴリ内の平均より高いかを判定
SELECT 商品名, 売上
FROM sales s1
WHERE 売上 > (SELECT AVG(売上) FROM sales s2 WHERE s1.カテゴリID = s2.カテゴリID);
相関サブクエリは、テーブル内の各行ごとに副問い合わせが実行されるので、データが多いと処理が遅くなることがある!
5. 副問い合わせ vs JOIN の使い分け
副問い合わせと JOIN は似たようなことができますが、それぞれに向き・不向きがあります。
+------------+------------------------+---------------------------+
| 比較項目   | 副問い合わせ            | JOIN                      |
+------------+------------------------+---------------------------+
| 可読性     | シンプルな場合は読みやすい | テーブルが増えると読みにくい |
| パフォーマンス | 大量データだと遅くなる  | 一般的に速い               |
| 使い所     | 単純な条件に便利        | 大規模データを扱うとき      |
+------------+------------------------+---------------------------+
例えば、先ほどの 売上が5000円以上の商品IDを持つ注文データの取得 では、JOIN を使うとより効率的になります。
SELECT orders.*
FROM orders
JOIN sales ON orders.product_id = sales.id
WHERE sales.売上 >= 5000;
副問い合わせは便利だけど、大量データを扱う場合はJOINの方が効率的!
6. まとめ
・副問い合わせ(サブクエリ)は「SELECT文の中に入れ子になったSELECT文」
・WHERE・SELECT・FROM などで使える
・スカラーサブクエリ・テーブルサブクエリ・相関サブクエリの3種類がある
・JOINを使う方が速い場合もあるので、適材適所で使い分けよう!
最後に
最初は 「サブクエリって難しそう…」 と思うかもしれませんが、実際に書いてみるとすぐ慣れます!
特に データを条件付きで絞り込むときに便利 なので、ぜひ活用してみてください。
「まずは試してみる!」が上達のコツです!