Web Analytics Made Easy - StatCounter

工業大学生ももやまのうさぎ塾

うさぎでもわかるをモットーに大学レベルの数学・情報科目をわかりやすく解説! 数式が読み込まれない場合は1回再読み込みしてみてください。

【基本情報対策】うさぎでもわかるデータベース 第02羽 関係演算

こんにちは、ももやまです。

今回はデータベースで出てくる関係演算について一緒にお勉強しましょう!

 

関係演算には、集合でもよく使われる

  • 直積

の4つと、データベースの関係演算独自の、

  • 選択
  • 射影
  • 結合

の4つがあります。

特に今黄色い線を引いた3つは、基本情報の試験や期末試験にも頻出する超重要な演算です。必ず覚えましょう。

 

1.集合演算

まずは、集合演算について見ていきましょう。

(1) 和

2つの表に対して、論理和(OR)を行う演算です。

つまり、2つの表のうち、どちらか一方でも存在する行を出力します。

f:id:momoyama1192:20200905230535g:plain

演算が成立するための条件

和、積、差の計算では、以下の2つの条件がそろっていない場合、そもそも計算を行うことができません。

 

(a) 2つの表の項目数が異なる場合

f:id:momoyama1192:20200905230541g:plain

(b) 2つの表の項目名が異なる場合

f:id:momoyama1192:20200905230546g:plain

基本的に、2つの表の項目が全く同じでないと演算ができないと思っていただけたらOKです。

(2) 積

2つの表に対して、論理積(AND)を行う演算です。

つまり、2つの表の両方に存在する行を出力します。

f:id:momoyama1192:20200905230550g:plain

和演算と同じく、2つの表にある項目が全く等しいときのみ演算を行うことができます。

(3) 差

2つの表に対して、演算元にある行の中から、演算先の行にないものを出力します。

f:id:momoyama1192:20200905230555g:plain

差の演算は、今まで紹介してきた和や積の演算と異なり、計算順序を変えると演算結果も変わるため、注意が必要です。

また、和演算・差演算と同じく、2つの表にある項目が全く等しいときのみ演算を行うことができます。

(4) 直積

2つの表にある項目のすべての組み合わせを出力します。

f:id:momoyama1192:20200905230602g:plain

 

2.関係演算(データベース独自)

つぎに、データベース独自の関係演算について見ていきましょう。

ここからが超重要ですよ!

(1) 選択

ある条件に従って特定の行を取り出す演算選択です。

(条件を \( c \)、表名を \( P \) とし、\( \sigma_c (P) \) と記号で表されます。)

(※記号については、基本情報などの情報処理試験では出ないので覚えなくてOKです) 

f:id:momoyama1192:20200905230607g:plain

例えば、上の例の場合、表Pから「部活がサッカー部の人」を行単位で出力しています。

SQLでの選択の書き方

SQLの場合、以下の青線部分が「選択演算」に相当します。(where句以降ですね。)

f:id:momoyama1192:20200906125033g:plain

※SQLについては第03羽で詳しく説明するので、まだわからなくてもOKです。

(2) 射影

ある条件に従って特定の列を取り出す演算射影です。

(選択する項目(列)を \( i \)、表名を \( P \) とし、\( \pi_i (P) \) と記号で表されます。) 

f:id:momoyama1192:20200905230613g:plain

例えば、上の例の場合、表Pから 名前, 部活 の列を抽出し、出力しています。

重複に注意!

射影の演算では、選択する列によっては、下のように行内のすべてのデータが全く同じになってしまうことがあります。

この場合、全く同じデータとなるものは最初の1回だけ出力し、2回目以上は出力しません。

f:id:momoyama1192:20200905230620g:plain

射影演算では、重複するデータを2度以上出力しないと頭の中に入れておきましょう!

SQLでの射影の書き方

SQLの場合、以下の赤線部分が「射影」に相当します。

 

f:id:momoyama1192:20200906125038g:plain

重複データを2回以上出力しない disctinct が必要な点に注意しましょう。 

※SQLについては第03羽で詳しく説明します。

 

(3) 結合

2つの表をある共通の列を用いてくっつける演算結合です。

結合演算には、

  • 等結合
  • 自然結合

の2つがあります。それぞれ見ていきましょう。

(a) 等結合

等結合は2つの表をある共通の列を用いて単純にくっつける演算です。

ただし、単純にくっつけるため、同じ意味を持った項目(ピンクの枠部分)が2つあって冗長になってしまいます。

f:id:momoyama1192:20200905230624g:plain

(b) 自然結合

等結合では、同じ意味を持った項目が2回出てきて冗長になってしまいます。

そこで、共通の列のうちの片方を削除する*1ことで冗長性を取り除いて結合したものが自然結合となります。

f:id:momoyama1192:20200905230630g:plain

特に指示がない限り、結合と言われたら、こちらの自然結合を表していると思っていただけたらOKです。

(c) 結合演算の仕組み

結合演算は、直積と選択の2つを組み合わせた演算です。

どうしてこの2つを組み合わせたら結合演算になるのかを、実際に1つ例で試すことで確認しましょう。

Step1. 2つの表の直積を取る

まず、2つの表の直積を求めることですべての組み合わせを求めます。

f:id:momoyama1192:20200905230635g:plain

Step2. くっつけるための条件

すべての組み合わせの中で、くっつけるための条件を満たすもの(結合元の列と結合先の列が等しい)を選択します。

(さらに、自然結合の場合、結合先の列を削除します。)

f:id:momoyama1192:20200905230641g:plain

確かに、結合演算は直積と選択の2つで表せることを確認しましたね。

(d) 結合の際の注意

結合演算を用いる際には、結合するための列条件の書き方に注意が必要です。

例えば、下のP, Qの表を結合させる場合、条件で「部活=部活」と書いてしまうと、どちらの表にある部活なのかがわからなくなってしまいます。

f:id:momoyama1192:20200905230646g:plain

このように項目名が2つの表で重複してしまう場合、どの表にある項目かを「表名.項目名」の形で書く必要があります。

例えば、上の例の場合、条件は、

学生.部活 = 部.部活

のように明記します。

SQLでの選択の書き方

SQLの場合、以下の青線部分が「結合」に相当します。

直積を意識せずに書けることが特徴ですが、項目名が2つの表で重複する場合は「表名.項目名」のようにどの表の項目であるかを明記する必要があります。

 

f:id:momoyama1192:20200906125047g:plain

※SQLについては第03羽で詳しく説明します。

 

(4) 商

直積を逆算したものが商となります。

といきなり言われてもわかりにくいと思うので、実際に1つ例で確かめてみましょう。

 

例えば、下のような演算でできる表 \( R \) があります。

f:id:momoyama1192:20200905230652g:plain

表 \( R \) は \( P \times Q \) の直積演算によってできた表ですね。

 

では、逆に直積によってできた表 \( R = P \times Q \) と表 \( P \) から表 \( Q \) を求めてみましょう、というのが商 \( R \div P \) の定義です。

f:id:momoyama1192:20200906125053g:plain

同じように、\( R \) と \( Q \) から \( P \) を求めることもできます。

f:id:momoyama1192:20200906125057g:plain

3.練習問題

では、前回と同じように基本情報の問題で3問ほど練習していきましょう。

練習1

関係データベースにおいて、表から特定の列を得る操作はどれか。

[基本情報技術者平成22年秋期 午前問30]

ア:結合
イ:削除
ウ:射影
エ:選択

 

練習2

関係XとYを自然結合した後、関係Zを得る関係代数演算はどれか。

[基本情報技術者平成30年秋期 午前問28]

f:id:momoyama1192:20200906125105g:plain

ア:射影と和
イ:選択
ウ:選択と射影
エ:選択と和

 

練習3

関係Rと関係Sに対して、関係Xを求める関係演算はどれか。

[応用情報技術者平成25年秋期 午前問30]

f:id:momoyama1192:20200906125101g:plain

ア:IDで結合
イ:差
ウ:直積
エ:和

 

4.練習問題の答え

解答1

解答:ウ

表から列を抜き出す演算は「射影」です。よって答えはウ。

[それぞれの選択肢]

ア:結合
→ 2つの表をくっつける演算

イ:削除
→ 関係演算ですらない。

ウ:射影
→ 表から特定の列を抜き出す演算

エ:選択
→ 表から特定の行を抜き出す演算

解答2

解答:ウ

まず、関係XとYを自然結合してみましょう。すると、下のような表となります。

f:id:momoyama1192:20200906132043g:plain

ここで、表Zを見てみると、

  • 学生番号2, 4の行が抽出されている(選択)
  • 学部名、学生番号、氏名の列が抽出されている(射影)

が行われていることがわかりますね。よって、答えはウです。

 

実際に結合した表に対して、選択演算と射影演算をやってみましょう。

まず、選択演算を行います。すると、下のような結果となります。

f:id:momoyama1192:20200906125109g:plain

さらに射影演算を行うことで、Zを得ることができます。

f:id:momoyama1192:20200906125113g:plain

解答3

解答:エ

まず、関係R, S, Xで項目の種類、数が一致していますね。

そのため、集合演算の和、差、積のいずれかとなります。

よって、選択肢アとウが消えます。

 

あとは和か差を考えるのですが、差演算であれば、計算元Rよりも結果Xのほうが行数が少なくなりますよね。(関係Rにあって関係Sにないものを出力するので、当然結果Xは関係Rよりも表の行数が減る)

 

よって、答えは和のエとなります。

実際にRとSを和演算するとXになることを確認しましょう。

 

5.さいごに

今回は、データベースの関係演算について説明しました。

関係演算を使うことで、データベース内にある表から様々な表を一時的に作り出すことができます。

 

このような一時的に作られた仮想的な表のことをビュー表と呼びます。

普段は整合性を保つために表を小分けにしておき、ユーザーに見せる際にユーザーが見やすいようにビュー表を一時的に作ることで、整合性、利便性の両立が可能となります。

 

次回からは、データベースを操作するプログラミング言語SQLについて説明していきたいと思います。

*1:基本的に後者の列が消されることが多いです。つまり、結合元Pと結合先Qを自然結合させる場合、共通の列のうち、結合先Qの列を削除することが多いです。