基本情報技術者試験 (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 は「行の有無」だけを見る(選ぶ列は無関係)こと
よくある疑問
「副問合せ」の練習問題 2 問
読んだ内容がそのまま出題されます。解答すると解説と、 その SQL を実行シミュレーターで開くリンクが出ます。
自由に試す / 他のレッスンを読む
データベース分野をもっと学ぶ(おすすめ書籍)
イラスト主体で科目Aの全範囲を通読できる入門書。用語の土台を作ってから科目Bのアルゴリズムに入ると理解が速い。
科目Aの頻出テーマを図と語呂で押さえる入門書。参考書と問題集を兼ねるので初受験の一冊目に選びやすい。
公開問題を大量に解いて仕上げるための問題集。擬似言語の読解に慣れた後、本番形式で時間配分を試す段階で使う。
本セクションはAmazonアソシエイトのリンクを含みます。
プログラムの読み方でつまずいたら。
たいてっくが、アルゴリズムの追い方から SQL・データベース設計まで、1対1で学習をサポートします。「コードを目で追っても何をしているか分からない」段階からで大丈夫です。まずは無料相談から。
「教え方も上手で、お人柄も良いメンターです。DB周りの知識はもちろん、何より、しっかり教えてあげようという姿勢がとてもありがたかったです。データベース、SQLの学習を考えている方にはおススメです。」
— H 様(DB・SQL コース受講)「体系的に知識を教えてくださり、実際の業務でも大変役立っております。特に短い時間で効率よく知識の習得や、練習をできているのは期待以上でした。」
— M 様(DB・SQL コース受講)「大変充実したコンテンツでわかりやすいご説明をありがとうございました。基本的な質問にも丁寧にご説明いただき、また業務のご相談にも乗って頂き大変有意義な時間でした。」
— K 様(DB・SQL コース受講)