はじめに
SQLを学んでいると「サブクエリ(副問い合わせ)」という言葉を耳にすることが多いでしょう。
サブクエリは、SELECT文の中にさらにSELECT文をネスト(入れ子構造)して使う機能です。
複雑な条件指定や集計処理をシンプルに書けるため、業務システムやデータ分析で頻繁に活用されます。
この記事では、サブクエリの基本から実践的な使い方まで、実例を交えて徹底解説します。
サブクエリとは?
**サブクエリ(Subquery)**とは、SQL文の中に埋め込まれるSELECT文のことです。
通常のSQL文の一部として利用され、主に次のような用途があります。
-
WHERE句での条件指定
-
FROM句での仮想テーブル生成
-
SELECT句での派生列計算
サブクエリの基本構文
サブクエリの基本的な形は以下の通りです。
用途によって、スカラサブクエリ、行サブクエリ、テーブルサブクエリと呼ばれることもあります。
例1:WHERE句でのサブクエリ
もっともよく使われるのが WHERE句での利用 です。
例えば「平均給与より高い社員を取得する」場合は次のように書けます。
-
サブクエリ
(SELECT AVG(給与) FROM 社員)
で平均給与を取得 -
メインクエリで給与がそれを上回る社員を抽出
例2:IN句とサブクエリ
複数の値を条件にする場合は IN句 を利用します。
-
サブクエリで特定の日に注文された商品IDを取得
-
メインクエリでその商品情報を表示
例3:FROM句でのサブクエリ(派生テーブル)
FROM句でサブクエリを使えば、仮想テーブルを作成して結合や集計が可能です。
-
サブクエリで部署ごとの平均給与を計算
-
メインクエリで平均給与が30万円を超える部署を抽出
例4:SELECT句でのサブクエリ
SELECT句にサブクエリを埋め込むことで、計算列を動的に追加できます。
-
社員ごとに部署名をサブクエリで取得
-
JOINを使わずにシンプルに表記可能(ただしパフォーマンス注意)
サブクエリを使うときの注意点
-
パフォーマンスに注意
ネストが深すぎると処理速度が落ちる場合があります。JOINやCTE(共通テーブル式)で置き換えを検討しましょう。 -
返却される値の型に注意
単一値を期待しているのに複数行が返るとエラーになります。 -
読みやすさを意識
サブクエリは便利ですが、複雑になると可読性が低下します。適切にインデントを整えるのが重要です。 - DBMS別:サブクエリ対応表
DBMS WHERE句でのサブクエリ FROM句でのサブクエリ SELECT句でのサブクエリ 相関サブクエリ 備考 Oracle ○ 完全対応 ○ インラインビュー ○ 利用可 ○ 高性能 大規模業務で多用 MySQL ○ (v4.1以降対応) ○ 利用可 ○ 利用可 △ パフォーマンス注意 古いバージョンでは非対応 PostgreSQL ○ 標準準拠 ○ 利用可 ○ 利用可 ○ 高性能 複雑な分析処理に強い SQL Server ○ 完全対応 ○ 利用可 ○ 利用可 ○ ただし過剰利用注意 実行計画が膨らむことあり
まとめ
-
サブクエリはSQL文の中でネストされたSELECT文
-
WHERE、FROM、SELECTなど多くの場面で利用可能
-
集計や複雑な条件指定をシンプルに書ける
-
パフォーマンスと可読性に注意が必要
サブクエリをマスターすることで、SQLの表現力が大幅に広がります。
まずはシンプルなWHERE句から練習し、徐々に複雑なケースに挑戦してみましょう!