Loading
  • LIGHT

  • DARK

ROUTE

ルートゼロの
アクティビティ

【SQL】副問い合わせ入門|基本構文から実例まで徹底解説

6

データベースを扱っていると、「特定の条件に合うデータを抽出したい!」という場面がよくありますよね。
そんなときに便利なのが 副問い合わせ(サブクエリ) です。
今回は、副問い合わせの基本から使い方まで、わかりやすく解説していきます!


1. 副問い合わせ(サブクエリ)とは?

副問い合わせ(サブクエリ)とは、 SQLの中で「別のSELECT文の結果」を利用すること です。
簡単に言うと、「あるSELECT文の結果を使って、別のSELECT文を実行する」仕組みです。

例えば、次のようなケースを考えてみましょう。

この場合、

  1. 「全体の平均売上を求める」SELECT文 を作る

  2. その結果を メインの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);

どう動く?

  1. (SELECT AVG(売上) FROM sales) で 全体の平均売上 を取得

  2. その結果を 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を使う方が速い場合もあるので、適材適所で使い分けよう!

最後に

最初は 「サブクエリって難しそう…」 と思うかもしれませんが、実際に書いてみるとすぐ慣れます!
特に データを条件付きで絞り込むときに便利 なので、ぜひ活用してみてください。

「まずは試してみる!」が上達のコツです!

もっとルートゼロを知りたいなら

DISCOVER MORE