データベースを扱っていると、「特定の条件に合うデータを抽出したい!」という場面がよくありますよね。
そんなときに便利なのが 副問い合わせ(サブクエリ) です。
今回は、副問い合わせの基本から使い方まで、わかりやすく解説していきます!
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を使う方が速い場合もあるので、適材適所で使い分けよう!
最後に
最初は 「サブクエリって難しそう…」 と思うかもしれませんが、実際に書いてみるとすぐ慣れます!
特に データを条件付きで絞り込むときに便利 なので、ぜひ活用してみてください。
「まずは試してみる!」が上達のコツです!