更新日:
システム開発の現場では、複雑な条件を満たすデータを抽出するために、複数のクエリを組み合わせたい場面によく遭遇します。SQL文の中にSELECT文をネストする、このようなSQL文のことを副問い合わせや副照会、サブクエリなどと呼びます。非常に便利な構文ですが、少しややこしくなるのできちんと理解しておきましょう。
参考サイト:MySQL 公式サイト(サブクエリ)
副問い合わせは検索結果の種類によって主に3パターンに分類されます。それぞれの特徴と具体的な記述スタイルを以下のようにまとめました。
単一行副問い合わせ
検索結果が、「1行1列の値」となる副問い合わせ。単一の値を記述するような場所であれば、基本的にどこでも記述することが可能。
特定の数値を直接書き込む代わりに、別のクエリの計算結果をそのまま代入するイメージです。実際の記述例を確認してみましょう。
① 例)収支テーブルからID = 1と同じ費目の出費を取得する。
| expense | expenditure |
|---|---|
| 飲食費 | 1000 |
| 飲食費 | 500 |
② 例)収支テーブルから費目が飲食費の日付と出費額と飲食費合計を取得する。
| date | expenditure | 飲食費合計 |
|---|---|---|
| 2026/05/11 | 1000 | 1500 |
| 2026/05/12 | 500 | 1500 |
複数列副問い合わせ
検索結果が、「複数の行から成る単一列の値」となる副問い合わせ。SQL文中で複数の値を列挙するような場所に、その代わりとして記述することが可能で、IN演算子を用いた条件式が代表的な事例です。
条件に合致する複数の候補リストを、内側のクエリが自動的に作成してくれます。
③ 例)収支テーブルから5000円以上の出費があった費目の全ての収支情報を取得する。
| id | expense | expenditure | remarks |
|---|---|---|---|
| 1 | 交通費 | 5400 | 大阪出張移動費 |
| 2 | 交通費 | 800 | 近隣交通費 |
| 3 | 宿泊費 | 8500 | ホテル宿泊代 |
表形式の副問い合わせ
検索結果が、「複数行と複数の列から成る表形式」となる副問い合わせ。通常のSQL文において表を記述することのできる場所、例えばSELECT文のFROM句などに記述します。
クエリによって一時的に作られた仮想のテーブルを、外側のSELECT文でさらに加工するような柔軟なデータ操作を実現できます。
④ 例)費目が交通費と定期代の出費額の合計を取得する。
| SUM(SUB.expenditure) |
|---|
| 15400 |

