SQLを学んでいると、「サブクエリ」という言葉に出会う方も多いのではないでしょうか。
「クエリの中にさらにクエリが入っている?どういうこと?」と混乱してしまうこともあるでしょう。
この記事では、サブクエリとは何か、その意味と仕組みについて、SQLの基本概念からデータベースにおける役割・実際の動作まで、初心者の方にもわかりやすく解説しています。
SQLをより深く使いこなすための第一歩として、ぜひ最後までご確認ください。
サブクエリとは?クエリ内クエリの基本的な概念
それではまず、サブクエリの基本的な概念について解説していきます。
サブクエリとは、SQLのクエリ文の中に入れ子(ネスト)状に記述された別のSELECT文のことです。
「サブクエリ(Subquery)」は「副問い合わせ」とも呼ばれ、外側のクエリ(メインクエリ)の中で使われるクエリのことを指します。
データベースからデータを取り出す際に、一度の問い合わせでは直接求めにくい結果を、サブクエリを組み合わせることで柔軟に取得できます。
サブクエリの基本的な構造:
SELECT * FROM 商品
WHERE 価格 > (SELECT AVG(価格) FROM 商品);
(内側の「SELECT AVG(価格) FROM 商品」がサブクエリ)
サブクエリが使われる場面
サブクエリは主に以下のような場面で活用されます。
| 使用場面 | サブクエリの役割 |
|---|---|
| WHERE句で条件の値を動的に取得する | 平均値・最大値・最小値などを計算して条件に使用 |
| FROM句で仮想テーブルを作る | サブクエリの結果を一時的なテーブルとして扱う |
| SELECT句で列の値を計算する | 行ごとに別テーブルから値を取得する |
| HAVING句でグループ条件に使用する | 集計結果と比較するための値をサブクエリで取得 |
| EXISTS・IN・ANYと組み合わせる | 他テーブルの存在確認や複数値との比較 |
メインクエリとサブクエリの実行順序
サブクエリとメインクエリの実行順序について理解しておくことが重要です。
基本的にサブクエリが先に実行され、その結果がメインクエリに渡される仕組みになっています。
ただし、相関サブクエリ(後述)の場合は外側のクエリと内側のサブクエリが行ごとに繰り返し実行されるため、処理の仕組みが異なります。
サブクエリと括弧の書き方
サブクエリは必ず括弧()で囲んで記述します。
括弧があることでデータベースエンジンはどこがサブクエリなのかを認識し、内側から順番に処理を行います。
サブクエリの基本的な記述ルール:
SELECT 列名 FROM テーブル名
WHERE 列名 演算子 (SELECT 列名 FROM テーブル名 WHERE 条件);
(サブクエリは必ず丸括弧で囲む)
サブクエリの種類と特徴を詳しく解説
続いては、サブクエリの種類と特徴を詳しく確認していきます。
サブクエリにはいくつかの種類があり、それぞれ異なる動作をします。
スカラーサブクエリ
スカラーサブクエリとは、1行1列の単一の値を返すサブクエリのことです。
SELECT句やWHERE句で特定の値と比較する際に使います。
スカラーサブクエリの例(全商品の平均価格より高い商品を取得):
SELECT 商品名, 価格 FROM 商品
WHERE 価格 > (SELECT AVG(価格) FROM 商品);
サブクエリが複数行の値を返してしまうとエラーになるため、単一の値を返すことが確実な場合に使用します。
テーブルサブクエリ(インラインビュー)
FROM句の中にサブクエリを記述すると、その結果を仮想的なテーブルとして扱えます。
これは「インラインビュー」とも呼ばれ、複雑な集計を段階的に行う際に便利です。
インラインビューの例(カテゴリ別平均価格を求めてから絞り込む):
SELECT カテゴリ, 平均価格
FROM (SELECT カテゴリ, AVG(価格) AS 平均価格
FROM 商品
GROUP BY カテゴリ) AS カテゴリ別平均
WHERE 平均価格 > 5000;
相関サブクエリ(行ごとに実行されるサブクエリ)
相関サブクエリとは、外側のクエリの列を参照しながら行ごとに繰り返し実行されるサブクエリです。
相関サブクエリはメインクエリの各行に対してサブクエリが1回ずつ実行されるため、データ量が多いと処理が遅くなる場合があります。
相関サブクエリの例(各カテゴリの最高値商品を取得):
SELECT 商品名, カテゴリ, 価格 FROM 商品 AS a
WHERE 価格 = (SELECT MAX(価格) FROM 商品 AS b
WHERE a.カテゴリ = b.カテゴリ);
サブクエリを使う際のパフォーマンスと注意点
続いては、サブクエリを使う際のパフォーマンスと注意点を確認していきます。
サブクエリは便利ですが、使い方によってはSQLのパフォーマンスに影響が出ることがあります。
サブクエリとJOINの使い分け
同じ結果をサブクエリとJOINのどちらでも実現できる場合があります。
一般的にはJOINの方が最適化されやすくパフォーマンスが高い場合が多いですが、データベースの種類やクエリオプティマイザーの性能によって異なります。
可読性を重視する場合はサブクエリ、大量データを処理する場合はJOINが適している場面が多いでしょう。
ネストが深くなりすぎる問題
サブクエリの中にさらにサブクエリを入れる多段ネストは、SQLの可読性を大きく下げます。
複雑なネストになってきたら、WITH句(CTE:共通テーブル式)を使って段階的に整理する方法が有効です。
CTEを使うとサブクエリに名前をつけて分かりやすく管理でき、デバッグもしやすくなります。
まとめ
この記事では、サブクエリとは何か、その意味と仕組みについてスカラーサブクエリ・インラインビュー・相関サブクエリの種類別に詳しく解説しました。
サブクエリはSQLの表現力を大幅に高める重要な機能であり、WHERE句・FROM句・SELECT句など様々な場所で活用できます。
パフォーマンスへの影響も意識しながら、JOINやCTEと使い分けることでより効率的なSQL記述ができるでしょう。
今回の内容を参考に、サブクエリをSQLの武器として活用していきましょう。