サブクエリ【subquery】副問い合わせ

SQLでは、SELECT文やINSERT文、UPDATE文、DELETE文などの内部に別のSELECT文を入れ子(ネスト)状に配置して記述することができる。外側の主となる問い合わせを「メインクエリ」、内側の埋め込まれた問い合わせを「サブクエリ」と呼ぶ。
データベースはまずサブクエリを実行し、その結果をメインクエリのWHERE句やHAVING句、FROM句などで利用する。例えば、「売上が全体の平均を上回る商品を取得する」といった処理を、平均値を別途取得して渡すことなく一つのSQL文として記述できる。サブクエリの内部にさらにサブクエリを記述して、何段階もの入れ子構造にすることも可能である。
サブクエリが返す結果の形式によって、用いる演算子が異なる。結果が単一の値(1行1列)となる「スカラサブクエリ」は、「=」や「<」「>」などの比較演算子を用いた条件式にそのまま組み込める。複数の行を返す場合はIN句やANY句、ALL句、EXISTS句といった演算子と組み合わせ、「結果のいずれかと一致する」「すべてより大きい」といった条件を記述する。
また、複数行・複数列の表形式の結果を返すサブクエリは、FROM句で仮想的な一時テーブル(派生テーブル)として扱われる。単一の値が求められる箇所に複数行を返すサブクエリを記述するとエラーとなるため、用途に応じた使い分けが必要である。このほか、メインクエリの各行の値をサブクエリ内で参照しながら処理を繰り返す「相関サブクエリ」という手法もある。外側の行ごとにサブクエリが評価されるため、行ごとに異なる条件での検索や判定が可能となる。
サブクエリを利用すると、従来であれば一度アプリケーション側にデータを取得して加工し、その結果を基に再度データベースに問い合わせる必要があった処理を、単一のSQL文だけで完結させることができる。一方で、相関サブクエリのように外側の行ごとにサブクエリが繰り返し評価されるケースなどでは処理負荷が高くなりやすく、大量データを扱う場面では結合(JOIN)処理や共通テーブル式(CTE:Common Table Expression)への書き換えで性能が向上する場合がある。