副問合せとは?ふくといあわせ
副問合せとは、SQL文の内部に書かれた別のSELECT文で、外側の問合せの一部として先に評価される。WHERE句では条件の比較対象として、FROM句では導出表として、SELECT句ではスカラ値として置ける。返す形が1値か1列か表かで、使える述語(比較演算子・IN・EXISTS)が変わる。
最終更新:2026-10-06
この語が出る過去問を解く →背景
「平均より給与が高い社員」のように、条件そのものが問合せの結果に依存する要求は、1つのSELECT文では書けない。集計してから比較するために結果を一時表へ落とす手続き型の書き方では、アプリ側に往復が増えて処理も遅くなる。問合せの中に問合せを入れ子にできるようにすれば、その計算をDBMS側で一度に済ませられる。試験では同じ結果を結合・EXISTS・副問合せのどれでも書けることを前提に、等価な書き換えが問われる。
具体例
SELECT 社員名 FROM 社員 WHERE 部門コード IN (SELECT 部門コード FROM 部門 WHERE 所在地='東京') と書くと、内側が先に東京の部門コードの一覧を作り、外側がそれに含まれる社員だけを返す。PostgreSQLではFROM句に置いた副問合せに別名を付ければ導出表として扱える。
試験での引っ掛け
IN述語による非相関の副問合せは、EXISTSを使った相関副問合せへ等価変換できることが多い。ただしNOT INは副問合せ側にNULLが混ざると結果が0件になるため、NOT EXISTSのほうが安全である。FROM句の副問合せには別名が必須という構文上の決まりも問われる。
関連用語
出た過去問
出典:平成28年度 春期 データベーススペシャリスト試験 午前Ⅱ 問9(IPA)解説で登場
次のSQL文と同じ検索結果が得られるSQL文はどれか。 SELECT DISTINCT TBL1.COL1 FROM TBL1 WHERE COL1 IN (S…
正解:SELECT DISTINCT TBL1.COL1 FROM TBL1 WHERE EXISTS (SELECT * FROM TBL2 WHERE TBL1.COL1 = TBL2.COL1)
要点:IN述語の副問合せは相関EXISTSに等価変換できる
IN述語による副問合せは、外側の行の値が副問合せの結果集合に含まれるかを判定するもので、相関副問合せを使ったEXISTS述語に書き換えられる。どちらもTBL2に同じCOL1の値が1件でもあればその行を残すという意味になり、結果は一致する。
出典:平成30年度 春期 データベーススペシャリスト試験 午前Ⅱ 問5(IPA)解説で登場
“社員”表に対して、SQL文を実行して得られる結果はどれか。ここで、実線の下線は主キーを表し、表中の'NULL'は値が存在しないことを表す。 〔社員〕 社員コー…
正解:社員コード: S002, S004, S007
要点:NOT EXISTSの相関副問合せで「部下を持たない社員」を抽出
この副問合せは「自分の社員コードを上司として持つ社員が存在するか」を調べており、NOT EXISTSで否定しているので、誰の上司にもなっていない社員だけが選ばれる。表では上司欄に現れるコードが部下を持つ社員なので、そこに一度も現れない社員が結果になる。
出典:平成30年度 春期 データベーススペシャリスト試験 午前Ⅱ 問10(IPA)解説で登場
“社員”表から、男女それぞれの最年長社員を除く全ての社員を取り出すSQL文とするために、aに入れる字句はどれか。ここで、“社員”表の構造は次のとおりであり、実線…
正解:SELECT MIN(生年月日) FROM 社員 AS S2 WHERE S1.性別 = S2.性別
要点:相関副問合せで同性内の最年長を求め、それより後を選ぶ
性別が同じ社員の中で最も早い生年月日を相関副問合せで求め、それより生年月日が後の社員だけを取り出せば、男女それぞれの最年長者が除かれる。外側の行の性別を副問合せの条件に渡す相関が要点である。
出典:平成31年度 春期 データベーススペシャリスト試験 午前Ⅱ 問14(IPA)解説で登場
ある電子商取引サイトでは、会員の属性を柔軟に変更できるように、“会員項目”表で管理することにした。“会員項目”表に対し、次の条件でSQL文を実行して結果を得る場…
正解:MAX
要点:最新行の採用と横持ち集約の両方をMAXで実現する
同じ会員番号・項目名の中で最も大きい行番号の値を採用するので、内側の副問合せではグループごとの行番号の最大値を求める必要がある。外側では項目名ごとに1行しかない値を1行にまとめるため、集約関数で取り出す。いずれもMAXを入れれば、該当しない場合の値はNULLのまま残る。
出典:令和2年度 10月試験 データベーススペシャリスト試験 午前Ⅱ 問8(IPA)解説で登場
"社員"表に対して、SQL文を実行して得られる結果はどれか。ここで、実線の下線は主キーを表し、表中のNULLは値が存在しないことを表す。 社員(社員コード(主キ…
正解:S002, S004, S007
要点:NOT EXISTSの相関副問合せで部下を持たない行を抽出
相関副問合せは、外側の行の社員コードを上司として持つ行が存在するかを調べている。NOT EXISTSなのでそれが1件もない社員、すなわち部下を1人も持たない社員が選ばれる。上司列に現れるのはS001・S003・S005・S006なので、残るS002・S004・S007が答えになる。
出典・参考
高度試験 午前I(高度午前I 相当)のシラバスの3 技術要素 > 3. データ操作 > (2) データベース言語に掲載されている用語です。
解説は資格暗記が独自に作成しています。過去問の出典は各問題に記載のとおりです。