【例付き】サブクエリ(副問い合わせ)とは?【SQL】
サブクエリについてクエリ例付きで説明します。サブクエリはクエリの中に入れ子の形で入ったクエリです。これだけ聞くと単純に聞こえるのですが、サブクエリには分かりにくさを生んでしまっているポイントがあるので、その点を重点的に説明します。
分かりにくさを生んでいるポイント
最大の分かりにくいポイントはサブクエリは利用の仕方が大きく二種類あるということです。その二種類とは以下です。
・サブクエリの結果を一時的なテーブルとして扱う
・サブクエリの結果を単一の値として扱う
それぞれ詳細にお話しします。
クエリ例には以下の売り上げを管理する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句で利用しています。
サブクエリを使いこなせない人はまずは売上額の平均を取得してから、その値を次に実行するクエリにコピペしてから実行する必要があります。しかしサブクエリを使いこなせるとそのようなコピペの手間が減らしヒューマンエラーのリスクをなくします。
まとめ
サブクエリは単純なものです。しかし取得結果を一時的なテーブルとして利用することもできますし、単一の値として利用することもできてしまうので、分かりにくさから苦手意識を持ってしまい使いこなせていない人がいます。
この記事を読んでいただいたことであなたは利用できるようになりました。
ぜひ業務や個人開発でサブクエリを活かしてください。