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