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

表の結合 — 内部結合と外部結合

定義

結合は複数の表を共通する列の値で組み合わせる操作。条件を書かないとすべての組み合わせ(直積)になる。内部結合は両方に対応する行がある組だけを返し、外部結合は片方にしか無い行も NULL を補って残す。

結合とは、共通する値で表をつなぐこと

リレーショナルデータベースでは、データを複数の表に分けて持ちます (正規化)。 分けたものを再び 1 つの表として見るのが結合です。

書き方は 2 通りある(結果は同じ)

-- 旧式のカンマ結合(過去問で最頻出)
SELECT 商品.商品名, 在庫.倉庫
FROM 商品, 在庫
WHERE 商品.商品番号 = 在庫.商品番号

-- INNER JOIN 記法
SELECT 商品.商品名, 在庫.倉庫
FROM 商品 INNER JOIN 在庫
  ON 商品.商品番号 = 在庫.商品番号

基本情報の過去問では上の書き方が多く出ます。JOIN という単語が出てこないので結合だと気づきにくいのですが、FROM に表が 2 つ並んでいたら結合だと判断してください。

試す: 下の 2 つの書き方は同じ結果になる。INNER JOIN 版に書き換えてみる

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

結合条件を書かないと直積になる

FROM 商品, 在庫 だけを書くと、すべての行の組み合わせが作られます。 商品 5 行 × 在庫 4 行 = 20 行です。これを直積と呼びます。

実は結合とは「直積を作ってから、条件に合う組だけを残したもの」です。 下の Playground で SELECT * FROM 商品, 在庫一つ進めるで追うと、FROM の段階で 20 行になり、 WHERE で 4 行に絞られるのが目で見えます。

試す: 一つ進める を押すと FROM の段階で 20 行になるのが見える

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

内部結合と外部結合

ここまでの結合は内部結合で、両方の表に対応する行がある組だけが残ります。 サンプルの表では、在庫が登録されていない商品(定規・ホチキス)は 結果から消えます。

「在庫が無い商品も一覧に出したい」場合は外部結合を使います。

SELECT 商品.商品番号, 商品.商品名, 在庫.倉庫
FROM 商品 LEFT OUTER JOIN 在庫
  ON 商品.商品番号 = 在庫.商品番号

LEFT OUTER JOIN左の表の行を必ず残し、 右に対応する行が無ければ右側の列を NULL で埋めます。RIGHT OUTER JOIN はその逆です。OUTER は省略できます。

試す: LEFT を RIGHT に、あるいは OUTER を消して INNER にすると行数が変わる

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

試験で問われるポイント

  • 結果の行数。内部結合で消える行がいくつあるかを数えさせる問題が定番です
  • 直積の行数。結合条件が無い選択肢を見抜けるか
  • 外部結合で NULL になる列がどちら側かを問う問題
  • 列名が両方の表にある場合は表名で修飾しないと曖昧になること

よくある疑問

Q.FROM A, B WHERE ... と INNER JOIN ... ON ... はどちらを使うべきですか?
A.結果はまったく同じです。基本情報の過去問では FROM A, B WHERE 形式の出題が多いので、まずこちらを確実に読めるようにしてください。実務では結合条件と絞り込み条件が分かれる JOIN ... ON のほうが読みやすいとされます。
Q.結合条件を書き忘れるとどうなりますか?
A.すべての行の組み合わせ(直積)になります。5 行の表と 4 行の表なら 20 行です。行数が急に増えていたら結合条件の書き忘れを疑ってください。
Q.外部結合で NULL になるのはどの列ですか?
A.相手が見つからなかった側の列すべてです。LEFT OUTER JOIN なら、左の表の行は必ず残り、対応する右の表の行が無い場合は右側の列がすべて NULL になります。

表の結合」の練習問題 3

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

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

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

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

オンライン個別指導

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

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

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