副問合せ(subquery)
SELECT文の中に書いたもう1つのSELECT文。その結果を値として使ったり、表のように扱ったりする。
もう少し詳しい説明
副問合せは、SELECT文の中に書いたもう1つのSELECT文です。内側の結果を、外側が使います。
書く場所で3つに分かれる
| 書く場所 | 内側の結果の扱い | 呼び方 |
|---|---|---|
| WHERE句 | 比較に使う値、または値の並び | — |
| FROM句 | 表のように扱う | 導出表、インラインビュー |
| SELECT句 | 1行1列の値 | スカラ副問合せ |
WHERE句に書く形
内側で求めた値を、条件に使います。
SELECT 商品名, 商品単価
FROM 商品
WHERE 商品単価 > (SELECT AVG(商品単価) FROM 商品)
平均より高い商品を取り出す、という形です。 平均は先に求めないと比べられないので、内側で求めます。
| 内側が返すもの | 使える比較 |
|---|---|
| 1つの値 | = > < などで比べられる |
| 複数の値 | IN、ANY、ALL などを使う |
1つの値を返すつもりの副問合せが複数行を返すと、誤りになります。 内側が何行返すかを確かめてください。
FROM句に書く形(導出表)
内側の結果を、名前を付けた表として扱います。
SELECT CK.区分, CK.金額計
FROM (SELECT 区分, SUM(金額) AS 金額計
FROM 実績
GROUP BY 区分) CK
| 使いどころ | 中身 |
|---|---|
| 集計した結果どうしを結合したい | 先に集計してから、表として結び付ける |
| 段階を分けて書きたい | 中間の結果に名前を付けて読みやすくする |
集計した結果どうしを結合する場面で効きます。 集計の単位が違う2つを、それぞれ先に集計してから突き合わせる形です。
このとき、片方にしか無い区分を残したいなら外部結合にします。残した側のNULLは、COALESCEで0に置き換えられます。
相関副問合せ
内側が、外側の行の値を参照する形です。
SELECT 社員番号, 氏名
FROM 社員 S
WHERE 給与 > (SELECT AVG(給与) FROM 社員
WHERE 部署コード = S.部署コード)
外側の1行ごとに、内側が計算し直されます。 「その人の部署の平均より高い人」のように、行ごとに基準が変わる条件を書けます。
| ふつうの副問合せ | 相関副問合せ | |
|---|---|---|
| 内側の計算 | 1回だけ | 外側の行ごと |
| 外側の値を使うか | 使わない | 使う |
| 処理の重さ | 軽い | 重くなりやすい |
結合との使い分け
| したいこと | 向くほう |
|---|---|
| 両方の表の列を並べて出す | 結合 |
| 条件の判定にだけ使う | 副問合せ |
| 集計した結果どうしを突き合わせる | FROM句の副問合せ + 結合 |
同じ結果を、結合でも副問合せでも書けることがあります。 読みやすいほうを選ぶ、という判断になります。
試験ではこう出る
科目A(旧・午前)では、副問合せの意味と、相関副問合せとの区別が問われます。外側の値を使うかどうかです。
午後や応用情報(データベース)では、SQLの空欄に書く形で出ます。FROM句の副問合せに名前を付ける部分や、外側と内側をつなぐ結合の書き方が空欄になります。
内側が何を返すか(1つの値か、表か)を先に読むと、外側の書き方が決まります。
関連する用語
- SQLの句
- SELECT文を組み立てる部品。副問合せを書く場所が決まる
- SQLの結合とDISTINCT
- 表をつなぐもう1つのやり方。使い分けになる
- 集約関数とNULL
- 副問合せの中でよく使う関数
- 基底表とビュー
- 問合せに名前を付けて残す形。副問合せと考え方が近い
ミニクイズ
副問合せの説明として、最も適切なものはどれか。
正解は 3番:SELECT文の中に書いたもう1つのSELECT文で、その結果を値や表として使う
副問合せは、SELECT文の中に書いたもう1つのSELECT文です。その結果を1つの値として比較に使ったり、表のように扱ってFROM句に置いたりします。条件に合う行どうしを結び付けるのは結合、名前を付けて保存するのはビュー、重複を取り除くのはDISTINCTで、いずれも別のものです。
この分野をまとめて解く → データベースのミニテスト(全35問)
最終更新:2026-11-09