FE EXAM

副問合せ(サブクエリ)

SQL文の中に入れ子で記述する別の問合せ。

INTERACTIVE VISUALIZATION
内側(副問合せ)
外側
フェーズ
idle
副問合せの結果
該当行
0
シナリオ
ステップ1 / 6
STEP 1/6入れ子になったSQLを見るこれは「平均給与より高い社員を取り出す」SQLです。よく見ると、SQL の中にもう1つ括弧でくくられた SELECT 文(副問合せ=サブクエリ)が入っています。外側の問合せが、内側の問合せの結果を使って動く、という入れ子(ネスト)構造になっています。
employeesnamesalaryAoki28Endo40Kato36Sato52
SQL
SELECT name, salary
FROM employees
WHERE salary > (
SELECT AVG(salary)
FROM employees
)
解説

📌
副問合せとは

外側: SELECT ... WHERE x > (内側: SELECT AVG(...) FROM ...)

副問合せ(サブクエリ)とは、1つのSQL文の中に、括弧でくくってもう1つのSELECT文を入れ子(ネスト)で書いたものです。外側の問合せが、内側の問合せの結果を材料として使います。

身近な例で考えると、「クラスの平均点を計算してから、その平均より高い人を選ぶ」という2段階の作業に似ています。先に平均(内側)を出し、その値を基準に選ぶ(外側)、という流れを1つのSQLにまとめたものです。

上のツールで▶ボタンを押すと、内側の副問合せが先に実行され、その結果が外側に差し込まれて最終結果が決まるまでの流れを確認できます。

🧩
種類(スカラ・行・表)

副問合せは、返ってくる結果の形によって主に3種類に分けられます。
スカラ副問合せ:値が1つ(1行1列)だけ返る。例:AVG(salary)。= や > と組み合わせる
行副問合せ:1行(複数列)が返る。複数の列をまとめて比較するときに使う
表副問合せ:複数行(表の形)が返る。IN や EXISTS と組み合わせて「○○のいずれかに一致するか」を判定する

スカラ39A39A39B52

上のツールの例はスカラ副問合せです。AVG(salary) が1つの値(平均給与)を返すので、外側で salary > (...) のように大小比較に使えます。複数の値が返るときは = ではなく IN や EXISTS を使う、という使い分けを覚えておきましょう。

🔁
実行順序

① 内側を実行平均=39 が確定② 外側を実行39と比べて抽出内側の結果を外側に差し込む

副問合せは「内側から先に実行する」のが原則です。外側の条件は内側の結果が出るまで判定できないため、データベースは次の順で処理します。
① 内側(副問合せ)を実行:結果(例では平均給与39)を確定させる
② 結果を外側に差し込むsalary > 39 という形になる
③ 外側を実行:差し込んだ値で行を絞り込む

身近な例で考えると、「先に基準(平均点)を計算してから、その基準で選ぶ」という当たり前の手順そのものです。なお外側の各行ごとに内側を繰り返し実行する「相関副問合せ」という形もありますが、まずは「内側が先」という基本の順序をしっかり押さえましょう。上のツールで内側→外側の流れを実際に追ってみてください。

📌
相関副問合せとの違い

通常の副問合せ内側を1回だけ実行→ 値が1つ確定外側を実行全行に同じ値で比較相関副問合せ外側の行を1行取る(例:田中 D01)内側を実行外側の値を使って比較行数ぶん繰り返す外側の各行ごとに内側が動く

ここまで解説してきた副問合せは「内側を1回だけ実行して値を確定させ、外側に渡す」形でした。これに対して、相関副問合せ(=外側の各行に対して内側を1回ずつ繰り返し実行する形)という応用形があります。

2つの違いを整理すると、次のようになります。
通常の副問合せ:内側が1回だけ動く。外側からは独立していて、外側の値を参照しない
相関副問合せ外側の行を1行処理するたびに内側が動く。内側が「今処理中の外側の行の値」を参照する

身近な例で考えると、通常の副問合せは「クラス全体の平均を先に1回計算してから、全員と比べる」イメージ。相関副問合せは「生徒1人ひとりについて、その生徒のグループ内平均を別々に計算してから比べる」イメージです。まずは通常の「内側が先に1回動く」形を確実に理解したうえで、相関副問合せは「繰り返し版」として把握しておきましょう。

📌
INとEXISTSの組み合わせ

IN を使う場合WHERE id IN ( SELECT id FROM ...)IDのリストに含まれるか判定EXISTS を使う場合WHERE EXISTS ( SELECT 1 FROM ...)行が存在するかどうか判定どちらも「副問合せの結果を条件にする」書き方

副問合せで複数の値が返ってくる場合(表副問合せ)は、= ではなく IN か EXISTS と組み合わせます
IN(=「いずれかと一致するか」):副問合せが返す値のリストの中に、比べたい値が含まれているかどうかを調べる
EXISTS(=「行が存在するか」):副問合せの結果に1行でも行があれば真(=条件を満たす)とみなす

なぜ = ではなく IN を使うのか= 39 は「1つの値と一致するか」を比べますが、副問合せが複数の行を返すと「どれと比べればよいか」が決まりません。IN は「リストの中のどれかと一致すればよい」という意味なので、複数の結果にも対応できます。たとえば「東京在住の社員ID一覧」を副問合せで取り出し、WHERE id IN (その一覧) と書くと「東京在住の社員の注文のみ」を絞り込めます。

まとめると:副問合せが1つの値を返す → = か > などで比較(スカラ副問合せ)複数の値を返す → IN か EXISTS と組み合わせる(表副問合せ)という使い分けが基本です。

練習問題

🎯
基本情報技術者 練習問題

Q1.副問合せ(サブクエリ)の説明として最も適切なものはどれか。
A.SQL文の中に入れ子で記述する別のSELECT文
B.結果を並べ替えるための句
C.2つの表を縦に連結する演算
D.テーブルを作成する命令
Q2.副問合せと外側の問合せが実行される順序として正しいものはどれか。
A.外側を先に実行し、そのあと内側を実行する
B.内側(副問合せ)を先に実行し、その結果を外側で使う
C.内側と外側を完全に同時に実行する
D.実行順序は決まっておらずランダムである
Q3.副問合せの種類のうち、1つの値だけを返すものを何と呼ぶか。
A.表副問合せ
B.行副問合せ
C.スカラ副問合せ
D.相関副問合せ

関連コンテンツ