基本情報の関係代数を選択・射影・結合の具体例で理解する

行・列の抽出と二つの表の対応をカードで表したイメージ

基本情報の関係代数は、「選択は行、射影は列、結合は表をつなぐ」と分けると理解しやすくなります。ただし、この覚え方だけでは、射影した後の行数や、複数の演算を続けた結果を取り違えることがあります。

この記事では、社員と部署を表す小さな表を使い、元の表から結果の表ができるまでを一つずつ確認します。射影の重複排除、直積と結合の違い、和・差・共通、演算順で必要な列を失うケースまで、自分で表をたどれるように整理します。例題の人物・部署・データは説明用の架空のものです。

この記事のポイント
  • 選択は条件に合う行を残し、射影は指定した列を残す
  • 関係代数の射影では、残した列の値がすべて同じ行を一つにする
  • 結合は条件に合う組合せ、直積はすべての組合せを作る
  • 複合問題は中間表を書き、後で必要な条件列と結合列を残す
無料

基本情報技術者試験 過去問アプリ

本番形式で繰り返し解ける。スキマ時間に1問から

2,000問以上収録
無料で過去問を解く
目次

基本情報の関係代数の基本操作

行と列の違いを無地のカードの並びで示すイメージ

関係・タプル・属性を表の言葉に置き換える

関係代数は、関係を入力として受け取り、別の関係を結果として作る操作の体系です。ここでは関係を「表」、タプルまたは組を「行」、属性を「列」と読み替えます。難しい記号に入る前に、どの表から何を取り出すかを日本語で説明できることが大切です。

スクロールできます
用語表での読み替えこの記事の例
関係/リレーション表全体社員表R
タプル/組1行分のデータ101・青木・D1・東京
属性列の項目社員番号、氏名、部署コード、勤務地
属性値各項目に入る値D1、東京など

以後は次の社員表Rを使います。社員番号は一人ごとに異なり、部署コードと勤務地は複数の社員で同じになる設定です。「D1が2回ある」ことと「同じ行が2回ある」ことを区別してください。行全体を比べれば、社員番号が違うので別の組です。

スクロールできます
社員番号氏名部署コード勤務地
101青木D1東京
102井上D2大阪
103上田D1東京
104江口D3東京
社員表R:4行・4列

この記事は、同じ組を重複して持たない集合としての関係代数を前提にします。また、読みやすさのために行を一定の順に並べていますが、上から何番目かという位置に意味はありません。答えを照合するときは、行の順よりも、含まれている値の組合せを確認します。

操作の定義と記号は、名古屋大学のデータベース講義資料(リレーショナルデータモデル)を参照しています。以下の社員表・部署表と計算例は、その定義を用いた独自の学習例です。

選択は条件に合う行を残す操作

条件に合う行を列ごと残す選択のイメージ

選択は、与えられた条件を満たす行を取り出す操作です。「勤務地が東京の社員」という指示なら、勤務地列の値を一行ずつ調べ、東京の行だけ残します。列は指定されていないので、社員番号や氏名も含めた元の4列をそのまま持ちます。

スクロールできます
社員番号氏名部署コード勤務地
101青木D1東京
103上田D1東京
104江口D3東京
勤務地=東京で選択した結果:3行・4列

結果から外れるのは、勤務地が大阪の102です。氏名だけを取り出したり、東京という値だけを集めたりする操作ではありません。選択の判定対象は列の値ですが、結果として残す単位は行全体です。

記号では選択にσ(シグマ)を使い、σ勤務地=東京(R)と書きます。「Rから、勤務地が東京という条件に合う行を選ぶ」と読みます。条件がすべての行に当てはまれば4行のまま、どの行にも当てはまらなければ0行です。選択で行数が必ず減るとは限りません。

「勤務地が東京、かつ部署コードがD1」なら、両方に当てはまる101と103だけです。「または」なら、どちらか一方を満たしても残ります。問題文の「かつ」「または」を取り違えたときは、各行に対して条件の真偽を二つ並べると確認しやすくなります。

射影は列を残し、同一になった行をまとめる操作

必要な列を抜き出し同じ組をまとめる射影のイメージ

射影は、表から指定した属性だけを取り出す操作です。社員表Rから「部署コード、勤務地」を取り出すと、社員番号と氏名の列はなくなります。ここで101と103の違いに使っていた列が消えるため、どちらもD1・東京という同じ組になります。

スクロールできます
部署コード勤務地
D1東京
D2大阪
D3東京
部署コード・勤務地に射影した結果:3行・2列

元の表は4行ですが、結果は3行です。関係を集合として扱うため、同じ組を二つ並べません。紙で計算するなら、いったん指定列だけ抜き出し、その後に行全体が一致するものを一つにすると誤りを防げます。

重複は一つのセルだけで判断しません。D1・東京とD3・東京は、勤務地が同じでも部署コードが違うので別の組です。一方、勤務地だけに射影すれば、東京・大阪の2行になります。何列残すかによって、同じ組とみなされる範囲が変わります。

射影の記号はπ(パイ)で、π部署コード,勤務地(R)のように書きます。すべての社員を個別に残したければ、例えば社員番号も射影の対象に含めます。社員番号・部署コード・勤務地の3列なら、101と103は別の組のままです。

「射影=列が減る」とだけ覚えると、列数しか見ずに4行を残してしまいがちです。指定列を残した後、行全体が重複しないかを確認するところまでを一つの操作として扱いましょう。

SQLと結び付けて覚える場合も注意が必要です。例えばPostgreSQLでは、通常のSELECTは重複行を残し、SELECT DISTINCTが重複を除きます。列の取り出しという対応だけで、集合としての射影と通常のSELECTを完全に同じにしないでください。詳細はPostgreSQL公式ドキュメントのSELECTで確認できます。

結合は条件に合う行の組合せを作る操作

二つの表の対応する行をつなぐ結合のイメージ

結合では、二つの表の行を条件に従って組み合わせます。社員表Rに部署名を付けたいので、次の部署表Sを使います。この表では部署コードが一意で、D1・D2・D3の各コードに対応する部署名は一つだけです。

スクロールできます
部署コード部署名
D1営業
D2開発
D3管理
部署表S:3行・2列

社員表と部署表を、部署コードが等しいという条件で対応付けます。101のD1は営業、102のD2は開発です。103もD1なので営業と組み合わさります。別の社員が同じ部署を参照しても、一人の行に吸収されるわけではありません。

スクロールできます
社員番号氏名部署コード勤務地部署名
101青木D1東京営業
102井上D2大阪開発
103上田D1東京営業
104江口D3東京管理
部署コードによる自然結合の結果:4行・5列

この二表で同名の列は部署コードだけなので、自然結合はその列の値が等しい組合せを作り、共通の部署コード列を一つにします。自然結合の記号はR ⋈ Sです。条件付きの結合では、何と何を比較するかを別に指定することもあります。

自然結合では、同名の属性すべてが一致条件になる点に気を付けてください。もし両方の表に「勤務地」という同名列もあれば、部署コードだけでなく勤務地も一致しなければ組み合わさりません。「同じ名前の列がほかにないか」を最初に確かめる必要があります。

結合後が4行なのは、各社員に一致する部署がちょうど1行ある設定だからです。例えば部署表にD1・第一営業とD1・第二営業という別の2行があれば、D1の社員2人はそれぞれ2行と対応します。D2とD3を各1行とすると、結果は2×2+1+1=6行です。一致相手がなければ、その社員はここで扱う内部結合の結果に入りません。

「結合したら行数は元の表と同じ」と決めず、各行が何行と対応するかを数えます。表を分ける設計の考え方まで確認したい場合は、基本情報の正規化の解き方を別に読むと整理できます。ここでは表を作り替える設計ではなく、与えられた表の操作に集中します。

和・差・共通は行の集合として考える

和・差・共通は、同じ構成で比べられる二つの表の行を扱います。まず「比較できる列数と、対応する列の値の種類になっているか」を確認しましょう。単にどちらも2列だからというだけで、社員番号・氏名の表と部署コード・部署名の表を合わせるのは適切ではありません。

ここでは列名も値の種類もそろえた、社員番号1列の参加者表A・Bを使います。Aは基礎講座の参加者101・102・103、Bは演習講座の参加者102・103・104です。どちらの表でも社員番号が一人を表します。

スクロールできます
演算意味この例の社員番号
A ∪ B:和少なくとも片方に含まれる101、102、103、104
A ∩ B:共通両方に含まれる102、103
A − B:差Aに含まれ、Bには含まれない101
B − A:差Bに含まれ、Aには含まれない104

和の行数は3+3=6ではありません。102と103は両方にあっても各1回なので4行です。また、差は引く向きが重要です。「基礎には参加したが演習には参加していない人」はA−Bであり、B−Aでは別の質問に答えてしまいます。

複数列の表で和・差・共通を求めるときは、行全体が一致するかを見ます。社員番号が同じでも、ほかの列が異なるなら同じ組ではありません。「どちらにもいる社員」を番号で判定したいなら、両方を社員番号に射影してから集合演算を行う、と操作対象を明確にします。

基本情報の関係代数を表の例題で解く

中間表を一段ずつ確認する学習のイメージ

結合・選択・射影を中間表で追う

社員表Rと部署表Sから、「勤務地が東京の社員について、氏名と部署名を求める」とします。求める列は氏名・部署名ですが、部署名はSにあるのでRだけでは作れません。二つの表を対応付け、行を絞り、最後に必要な列を取り出す方針です。

最初は部署コードで自然結合します。前章に示した4行・5列の結合結果が中間表Tです。続いてTの勤務地を確認し、東京の行だけ残します。この時点では、まだ社員番号や部署コードを捨てません。

スクロールできます
社員番号氏名部署コード勤務地部署名
101青木D1東京営業
103上田D1東京営業
104江口D3東京管理
中間表U:結合結果Tから勤務地=東京で選択した3行

次にUから氏名・部署名へ射影します。青木・営業、上田・営業は部署名が同じでも氏名が違うので、二つの行として残ります。今回は射影によって重複する組が生じず、3行・2列が答えです。

スクロールできます
氏名部署名
青木営業
上田営業
江口管理
最終結果V:氏名・部署名への射影

式ではπ氏名,部署名(σ勤務地=東京(R ⋈ S))です。一番外側のπから先に操作するのではなく、括弧の内側から読みます。中間表に名前を付けると、式が長くなっても今どこを操作しているかを見失いにくくなります。

スクロールできます
段階操作行数列数
TRとSを自然結合45
UTから勤務地=東京で選択35
VUから氏名・部署名へ射影32

もし答えとして「東京で勤務している社員が所属する部署名だけ」を求められたら、最後は部署名だけに射影します。その場合、営業が一つにまとまるため、答えは営業・管理の2行です。同じ中間表でも、最終的に何を一覧にするかで結果の行数が変わります。

直積と結合の違いを確かめる

すべての組合せと条件に合う組合せを分けるイメージ

直積は、二つの表の行をすべての組合せでつなぐ操作です。部署コードが合うかを調べる前の段階と考えられます。ここだけは見やすくするため、社員側を101・D1と102・D2の2行、部署側をD1・営業とD2・開発の2行に絞った別の小表を使います。

スクロールできます
社員番号社員側コード部署側コード部署名
101D1D1営業
101D1D2開発
102D2D1営業
102D2D2開発
2行×2行の直積:4通りの組合せ

101と開発、102と営業という実際の所属に合わない組合せも含まれます。直積は所属関係を確かめる操作ではないためです。表の中の「社員側コード」「部署側コード」は、同名列を区別して表示するための説明用の名前です。

この4行から社員側コード=部署側コードで選択すると、101・D1・D1・営業と102・D2・D2・開発の2行が残ります。これが等しいという条件による結合の結果です。共通コードを1列に整理した自然結合なら、列は社員番号・部署コード・部署名の3列になります。

直積の行数は、元の表がm行とn行ならm×nです。最初の社員表4行と部署表3行なら12行で、結合ではそのうち条件に合う4行が残ります。「すべて組み合わせる」のか「条件に合う組合せだけ残す」のかを読み分けると、結合と直積を混同しにくくなります。

0行の表との直積は0行です。一方が空なら、どの行とも組を作れません。直積の結果を数える問題では、列の値が似ているかよりも先に、入力の行数を確定させましょう。

射影を先にすると条件列を失う

後の条件判定や結合に必要な列を残すイメージ

「選択してから射影」と「射影してから選択」は、いつでも入れ替えられるわけではありません。先ほどの目的に対して、社員表Rを最初に氏名だけへ射影したらどうなるか、途中の表を書いてみます。

スクロールできます
氏名
青木
井上
上田
江口
氏名だけに射影した表:勤務地も部署コードもない

この表を見ても、東京勤務かどうかを判定できません。部署コードもないため、部署表と本来の対応付けをすることもできません。頭の中で元の表を思い出せても、演算が受け取る入力はこの1列表です。失った列を、後の選択や結合が自動で補うことはありません。

先に列を減らしたいなら、最終出力の氏名に加えて、条件判定に使う勤務地と結合に使う部署コードを残します。Rを氏名・部署コード・勤務地の3列へ射影しておけば、東京の選択も部署表との結合も可能です。社員番号を最後まで残す必要があるかは、求める答えに従って判断します。

逆に、社員表Rを先に勤務地=東京で選択し、それから部署表Sと結合する手順なら、この例では同じ最終結果になります。選択条件が社員側の列だけで判断でき、部署との対応も失われないためです。「順番を変えてよい」と丸暗記するより、次の操作が使う列が残るかを確かめてください。

先に射影する前の確認
  • 答えに必要な列を残しているか
  • 後の選択条件で使う列を残しているか
  • 後の結合条件で使う列を残しているか
  • 重複がまとまっても、求める一覧の意味が変わらないか

例えば、同じ氏名・同じ部署・同じ勤務地の社員が二人いた場合、社員番号を捨てると二人の区別がなくなります。「社員ごと」の一覧を求める問題なら番号が必要です。「氏名と部署の組合せ」の一覧なら同じ組を一つにするのが適切です。列を残す判断と重複の判断を、問題の要求に結び付けましょう。

操作名を答える問題は行と列を別々に比べる

元の表と結果の表だけを示され、どの演算を使ったかを答える場合は、まず列を比較します。元にあった列がなくなり、残った列の値をそのまま使っているなら射影を検討します。次に、元の行のうち条件に合う一部だけになっていれば選択を検討します。

列と行が両方減っているからといって、選択と射影が必ず必要とは限りません。社員表Rから勤務地だけへ射影する例では、射影だけで4行から2行になります。行数が減った理由が条件による除外か、重複排除かを確認することが重要です。

二つの表の情報を横につないだ結果なら結合または直積を、同じ列構成の表の行を合わせた結果なら和を考えます。「表が二つある」だけでは決まりません。列の構成が横に広がったのか、同じ列のまま行の集合を操作したのかを見てください。

スクロールできます
結果の特徴確認すること
元と同じ列で行が一部だけ条件で絞った選択か
指定列だけになった射影後の重複排除も含めて一致するか
二表の列が組み合わさった全組合せの直積か、条件付きの結合か
同じ列のまま二表の行を扱う和・差・共通のどの集合に当たるか

SQLの選択肢と対応付ける段階へ進むなら、基本情報のSQL問題の解き方で文法と照合できます。関係代数で「どんな表を得たいか」を整理してから読むと、列の指定と行の条件を区別しやすくなります。

自分で解く確認問題と解答

元の表と中間表と結果をカードで見比べる検算のイメージ

ここまでの社員表Rを使って、次の三問を紙やメモで解いてください。答えの行だけでなく、「選択した後は何列か」「射影で重複が消えるか」まで確認すると、どこで取り違えたかが分かります。

  • 問1:勤務地=東京で選択した後、部署コードだけへ射影すると何行になるか。
  • 問2:社員表Rから部署コード・勤務地だけへ射影すると、D1・東京は何行残るか。
  • 問3:部署表SのD1行をD1・第一営業とD1・第二営業の2行に置き換え、部署コードで結合すると何行になるか。D2・D3はそのままとする。

問1は2行で、D1とD3です。選択直後は101・103・104の3行・4列ですが、部署コードだけへ射影するとD1が重なるため1行にまとまります。「東京は3人だから答えも3行」という数え方では、射影の処理を見落としています。

問2は1行です。元の101と103は社員番号・氏名が違いますが、それらを捨てた後のD1・東京は同一の組です。D2・大阪、D3・東京と合わせた射影結果全体は3行になります。

問3は6行です。D1に属する101と103は、それぞれ二つの部署行と組み合わさるので4行。D2の102とD3の104が各1行ずつ加わります。社員番号が同じでも部署名が違う組は別なので、自然結合後もこの6行が残ります。

間違えたときは演算名をもう一度暗記するだけでなく、元の表、1回目の操作後、最終結果の三段階を並べてください。列を消した時点なのか、行を絞った時点なのか、組合せを数えた時点なのかを特定すると、同じ誤りを繰り返しにくくなります。

基本情報の関係代数は行・列・対応付けから整理する

選択は条件に合う行を残し、射影は指定した列を残し、結合は条件に合う行同士をつなぎます。射影したら行全体の重複を除き、結合したら一つの行に一致する相手が何行あるかを数える。この二点を加えると、単純な「行・列」の暗記から一歩進めます。

複数の演算を組み合わせる問題は、括弧の内側から中間表を作り、各段階の行数と列数を確かめましょう。先に射影するときは、答えの列だけでなく、後で使う条件列と結合列も残します。表の値に戻って検算できれば、記号の見た目に迷わず結果を説明できます。

解説を読んだら、基本情報の過去問アプリで無料演習に進み、答えだけでなく選んだ理由も確かめてみてください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次