基本情報技術者試験 (FE) 科目 A — データベース

副問合せ — IN・EXISTS・相関副問合せ

定義

副問合せは SQL の中に入れ子で書く SELECT 文。外側の行の値を参照するものを相関副問合せと呼び、行ごとに評価し直される。EXISTS は結果が 1 行以上あれば真を返す。

副問合せは SQL の中の SQL

副問合せ(サブクエリ)は、SQL の中に入れ子で書く SELECT 文です。 「他の表に存在しないものを探す」「平均より上のものを探す」といった、 1 回の問合せでは書けない条件を表現できます。

IN — 値のリストとして使う

SELECT 商品番号 FROM 商品
WHERE 商品番号 NOT IN (SELECT 商品番号 FROM 在庫)

内側の SELECT が「在庫のある商品番号の一覧」を返し、 外側はその中に含まれない商品を探します。 結果は「在庫が 1 件も無い商品」です。

試す: NOT IN の NOT を消すと「在庫のある商品」になる

リセットで表の中身も元に戻ります
エディタを読み込み中…

EXISTS — 行が存在するかどうかだけを見る

SELECT 商品番号 FROM 商品
WHERE NOT EXISTS (
  SELECT 1 FROM 在庫 WHERE 在庫.商品番号 = 商品.商品番号
)

内側の WHERE 在庫.商品番号 = 商品.商品番号外側の行を参照している点に注目してください。 これが相関副問合せです。外側の商品 1 行ごとに 内側が実行し直され、結果が 1 行でもあれば EXISTS が真になります。

SELECT 1 と書いているのは、EXISTS は行があるかどうかしか見ないためです。 何を選んでも結果は変わりません。

試す: SELECT 1 を SELECT 倉庫 に変えても結果は同じ (EXISTS は行の有無だけを見る)

リセットで表の中身も元に戻ります
エディタを読み込み中…

スカラ副問合せ — 1 つの値として使う

SELECT 商品名 FROM 商品
WHERE 単価 = (SELECT MAX(単価) FROM 商品)

内側が 1 行 1 列だけを返す場合、その値をそのまま比較に使えます。2 行以上返るとエラーになるので、 集約関数で 1 行にまとめるのが定石です。

試す: MAX を MIN や AVG に変える / 集約を外すとエラーになる

リセットで表の中身も元に戻ります
エディタを読み込み中…

NOT IN に NULL が混ざると 1 行も返らない

これは SQL で最も有名な罠のひとつで、試験でも狙われます。

-- 在庫数に NULL の行があると、これは 0 行になる
SELECT 商品番号 FROM 商品
WHERE 単価 NOT IN (SELECT 在庫数 FROM 在庫)

NOT IN は「どれとも等しくない」を意味しますが、NULL との比較は不定 (UNKNOWN) になります。1 つでも NULL があると 「等しくないと言い切れない」状態になり、条件が真になりません。

同じことを NOT EXISTS で書けばこの問題は起きません。NOT IN と NOT EXISTS が「同じ結果になる/ならない」を問う問題は頻出です。

試す: 在庫数に NULL があるので 0 行になる。NOT EXISTS で書き直すと取れる

リセットで表の中身も元に戻ります
エディタを読み込み中…

試験で問われるポイント

  • NOT IN と NOT EXISTS が同じ結果になるかを問う問題
  • 相関副問合せがどの行を参照しているかを追えること
  • スカラ副問合せが 2 行以上返すと成立しないこと
  • EXISTS は「行の有無」だけを見る(選ぶ列は無関係)こと

よくある疑問

Q.IN と EXISTS はどちらを使ってもよいですか?
A.NULL が絡まない限り結果は同じです。ただし NOT IN は候補に NULL が 1 つでも混ざると 1 行も返らなくなるのに対し、NOT EXISTS は期待どおりに動きます。この違いが試験でも実務でも重要です。
Q.相関副問合せとは何ですか?
A.内側の SELECT が外側の行の列を参照しているものです。外側の行が変わるたびに内側が評価し直されるため、外側の行数だけ実行されます。EXISTS と組み合わせて使うのが典型です。
Q.副問合せは WHERE 以外にも書けますか?
A.書けます。SELECT の列として 1 つの値を返す形(スカラ副問合せ)や、FROM に書いて仮の表として使う形もあります。基本情報では WHERE に書く形が中心です。

副問合せ」の練習問題 2

読んだ内容がそのまま出題されます。解答すると解説と、 その SQL を実行シミュレーターで開くリンクが出ます。

自由に試す / 他のレッスンを読む

データベース分野をもっと学ぶ(おすすめ書籍)

本セクションはAmazonアソシエイトのリンクを含みます。

オンライン個別指導

プログラムの読み方でつまずいたら。

たいてっくが、アルゴリズムの追い方から SQL・データベース設計まで、1対1で学習をサポートします。「コードを目で追っても何をしているか分からない」段階からで大丈夫です。まずは無料相談から。

無料相談を予約する →
受講者の声 (DB・SQL コース)
menta レビュー原文を見る →
  • 教え方も上手で、お人柄も良いメンターです。DB周りの知識はもちろん、何より、しっかり教えてあげようという姿勢がとてもありがたかったです。データベース、SQLの学習を考えている方にはおススメです。
    H 様DB・SQL コース受講
  • 体系的に知識を教えてくださり、実際の業務でも大変役立っております。特に短い時間で効率よく知識の習得や、練習をできているのは期待以上でした。
    M 様DB・SQL コース受講
  • 大変充実したコンテンツでわかりやすいご説明をありがとうございました。基本的な質問にも丁寧にご説明いただき、また業務のご相談にも乗って頂き大変有意義な時間でした。
    K 様DB・SQL コース受講