【例付き】サブクエリ(副問い合わせ)とは?【SQL】

2024年4月14日

当サイトはアフィリエイト広告を利用しています。

サブクエリについてクエリ例付きで説明します。サブクエリはクエリの中に入れ子の形で入ったクエリです。これだけ聞くと単純に聞こえるのですが、サブクエリには分かりにくさを生んでしまっているポイントがあるので、その点を重点的に説明します。

分かりにくさを生んでいるポイント

最大の分かりにくいポイントはサブクエリは利用の仕方が大きく二種類あるということです。その二種類とは以下です。

・サブクエリの結果を一時的なテーブルとして扱う
・サブクエリの結果を単一の値として扱う

それぞれ詳細にお話しします。

クエリ例には以下の売り上げを管理するsalesテーブルを利用します。

mysql> select * from sales;
+----+-------------+---------+------------+
| id | salesperson | amount  | sale_date  |
+----+-------------+---------+------------+
|  1 | Messi       | 1000.00 | 2022-01-01 |
|  2 | Ronald      | 1200.00 | 2022-02-01 |
|  3 | Messi       |  900.00 | 2022-02-15 |
|  4 | Ronald      | 1500.00 | 2022-03-01 |
|  5 | Messi       | 1100.00 | 2022-03-15 |
+----+-------------+---------+------------+
5 rows in set (0.00 sec)

mysql>

一時的なテーブルとしての利用

所感としてサブクエリの利用方法としてメジャーなのがこの一時的なテーブルとしての利用です。from句と併用して、サブクエリでの取得結果を対象にさらに絞り込むときなどに利用します。

クエリ例

SELECT salesperson, total_sales 
FROM (
    SELECT salesperson, SUM(amount) AS total_sales
    FROM sales
    GROUP BY salesperson
) AS sales_totals
ORDER BY total_sales DESC;

実行結果

+-------------+-------------+
| salesperson | total_sales |
+-------------+-------------+
| Messi       |     3000.00 |
| Ronald      |     2700.00 |
+-------------+-------------+
2 rows in set (0.00 sec)

salesperson毎の売り上げの合計値をもとに降順で並び替えて出力するクエリです。

サブクエリによって取得したデータをsales_totalsという名称の一時的なテーブルとして作成し、from句で指定しています。

このサブクエリの使い方は以下のようなときに有用です。

・複雑なクエリを複数のクエリに分割することで、分かりやすいクエリにする
・サブクエリでカバリングインデックスを利用して処理を高速化する

※ カバリングインデックスはインデックスの情報のみを利用したクエリで、非常に高速に動作します。詳しくは以下の記事で説明しているので良ければ。

単一の値としての利用

サブクエリの結果をテーブルとしてではなく、単一の値として利用することも可能です。サブクエリで計算した値を利用してさらに絞り込みの要素として利用できるので使いこなせると非常に強力です。

クエリ例

SELECT salesperson, amount
FROM sales
WHERE amount > (SELECT AVG(amount) FROM sales);

実行結果

+-------------+---------+
| salesperson | amount  |
+-------------+---------+
| Ronald      | 1200.00 |
| Ronald      | 1500.00 |
+-------------+---------+
2 rows in set (0.00 sec)

このクエリではサブクエリで売上平均額を単一の値として取得し、メインクエリのwhere句で利用しています。

サブクエリを使いこなせない人はまずは売上額の平均を取得してから、その値を次に実行するクエリにコピペしてから実行する必要があります。しかしサブクエリを使いこなせるとそのようなコピペの手間が減らしヒューマンエラーのリスクをなくします

まとめ

サブクエリは単純なものです。しかし取得結果を一時的なテーブルとして利用することもできますし、単一の値として利用することもできてしまうので、分かりにくさから苦手意識を持ってしまい使いこなせていない人がいます。

この記事を読んでいただいたことであなたは利用できるようになりました。

ぜひ業務や個人開発でサブクエリを活かしてください。

直近でおすすめの本

直近十数冊読んだ中で一番おすすめの本です。

人が行動をするに至るまでのステップを科学的に分析した上で、その結果を習慣と紐付けて解説してくれている本です。

悪い習慣を断ち、良い習慣を継続する方法を詳細に説明してくれています。習慣が人を作っているので、この本の内容を実践できれば人生を大きく好転させられる気がしました。

この本の最初の方に説明があるのですが、複利という考え方があり毎日1パーセントだけの増加でもそれが続くととてつもない倍率になります。これは投資でよく用いられる概念ですが、良い習慣は未来への投資なので習慣にもあてはまります。良い習慣を身に付けるのは早ければ早いほど良いです。

私はまず長時間YouTubeを見てしまう習慣を断って、直近の業務に役立つITの勉強を習慣として身に付けよう思います。