基本情報暗記無料で始める

相関副問合せとは?そうかんふくといあわせ

相関副問合せとは、SQL の副問合せ(WHERE 句などの中に書く、もう1つの SELECT 文)のうち、内側の問合せが外側の問合せの表の列を参照しているもの。外側の行が1行決まるたびに、その行の値を使って内側の問合せが評価し直される。このため内側だけを取り出して単独で実行することはできない。EXISTS(副問合せの結果が1行でもあれば真になる述語)と組み合わせて使うことが多い。

最終更新:2026-10-10

試験情報

基本情報技術者試験の頻出用語/テクノロジ系

別名:相関サブクエリ、相関副問い合わせ

基本情報を最短で暗記・合格する →

背景

ふつうの副問合せは内側を一度だけ実行し、その結果を外側の条件に使う。この形は「全社員の平均給与より高い社員」のように、全員を同じ基準で比べる条件に向く。「自分の所属する部署の平均給与より高い社員」のように、行ごとに比べる基準が変わる条件では、部署ごとの平均を別に求めて表を結合するなど手間が増える。比較の基準を外側の行に合わせて変えられるのが相関副問合せで、外側の行ごとに条件を変えて調べたい場面を短く書ける。

具体例

PostgreSQL や MySQL で、社員表から「自分の部署の平均より給与が高い社員」を取り出す SQL は、SELECT 氏名 FROM 社員 S WHERE 給与 > (SELECT AVG(給与) FROM 社員 WHERE 部署 = S.部署) と書く。FROM 社員 S の S は社員表に付けた短い別名で、内側の問合せから外側の行を指すために使う(日本語訳:社員表の各行 S について、S と同じ部署の平均給与を求め、S の給与がそれより大きければ氏名を出す)。内側の S.部署 が外側の行を参照しているので相関副問合せになる。「注文が1件もない顧客」なら、SELECT 顧客名 FROM 顧客 C WHERE NOT EXISTS (SELECT * FROM 注文 WHERE 注文.顧客番号 = C.顧客番号) と書く。C は顧客表に付けた別名で、SELECT * は「すべての列を取り出す」という意味。ここでは行の中身は使わず、行があるかどうかだけを見るために置いている(日本語訳:顧客表の各行 C について、注文表に C と同じ顧客番号の注文が1件も無ければ、C の顧客名を出す)。内側の C.顧客番号 が外側の行を参照しているので、これも相関副問合せである。

試験での引っ掛け

内側が外側の列(例の S.部署)を参照していれば相関、参照していなければふつうの副問合せで、試験はこの見分けを問う。ふつうの副問合せは内側を1回だけ実行し、相関副問合せは外側の行ごとに評価される点を逆に覚えない。EXISTS は副問合せの行の中身ではなく「1行でもあるか」だけを見る。NOT EXISTS はその逆で、副問合せの結果が1行も無いときに真になる(例の「注文が1件もない顧客」)。

関連用語

解説は資格暗記が独自に作成しています。過去問の出典は各問題に記載のとおりです。

基本情報を最短で暗記・合格する →

試験での特徴
  • 分野:テクノロジ系
  • 内側が外側の列(例の S.部署)を参照していれば相関、参照していなければふつうの副問合せで、試験はこの見分けを問う。