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

2024年4月14日

当サイトはPR広告を利用しています。

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

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

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

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

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

クエリ例には以下の売り上げを管理する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句で利用しています。

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

まとめ

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

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

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

直近でおすすめの本

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

ビジネスデザイナーという肩書きを持つイノベーションシンキングの世界的第一人者である濱口秀司さんの書かれた本です。肩書きだけだとどのようなことをしている人か分かりにくいかもしれませんが、USBメモリやマイナスイオンドライヤーなど誰もが知る有名商品の産みの親の方です。

アメリカのコンサルタントの中でも最高額のコンサルティングフィーを受け取っている方で、私の友人から聞いた話だとこの人のコンサルティングを受けるためには1時間でも7桁の額は準備する必要があるとのことでした。

濱口秀司さんは自分の中でイノベーションを起こすための型を持っており、その型について本の中でかなり詳しく教えてくれています。革新的なアイデアを出す方法をここで詳細にはお伝えしませんが、とてもざっくりとまとめると以下の手順になります。

バイアスの特定→バイアスの破壊

革新とは現状の破壊です。現在世の中にあるバイアスを認知するところからアイデアの創出は始まります。この本ではバイアスを認知する方法、そして破壊する方法を詳しく述べてくれています。個人開発をしようとしているけど何を作れば良いか思い浮かばない方やや会社を立ち上げようとしている方に特におすすめの本です。

過去におすすめした本は以下の記事にまとめています。