茨の道も一歩から

インフラ構築からプログラミング(Python・JavaScript)までITに関するブログです。

データベース:関係演算

■ 関係演算

関係演算とは

  • 関係代数独自の演算であり、以下の4種類がある。

射影

  • 表の中から指定した列を取り出す演算である。

[社員]

社員コード 社員名 電話番号
00001 ホムペ太郎 03-0000-1111
00002 ブログ次郎 06-9999-2222
00003 ソシャ三郎 045-888-3333
SELECT 社員名,電話番号 FROM 社員;

[社員]

社員名 電話番号
ホムペ太郎 03-0000-1111
ブログ次郎 06-9999-2222
ソシャ三郎 045-888-3333

選択

  • 表の中から指定した行を取り出す演算である。

[社員]

社員コード 社員名 電話番号
00001 ホムペ太郎 03-0000-1111
00002 ブログ次郎 06-9999-2222
00003 ソシャ三郎 045-888-3333
SELECT * FROM 社員 WHERE 社員コード = '00002';

[社員]

社員コード 社員名 電話番号
00002 ブログ次郎 06-9999-2222

結合

  • 共通の列を結合のキーとして、複数の表を結び付ける演算である。
  • 結合には、等結合、自然結合、外部結合などがある。

[社員]

社員コード 社員名 電話番号 所属コード
00001 ホムペ太郎 03-0000-1111 01
00002 ブログ次郎 06-9999-2222 01
00003 ソシャ三郎 045-888-3333 02

[所属]

所属コード 部署名
01 情報発信部
02 情報共有部

◇等結合

  • キー列は演算結果に重複して取り出される。
  • 等結合演算 = 直積演算 + 選択演算 で表現できる。
SELECT * FROM 社員,所属 WHERE 社員.所属コード = 所属.所属コード;
社員コード 社員名 電話番号 社員.所属コード 所属.所属コード 部署名
00001 ホムペ太郎 03-0000-1111 01 01 情報発信部
00002 ブログ次郎 06-9999-2222 01 01 情報発信部
00003 ソシャ三郎 045-888-3333 02 02 情報共有部

◇自然結合

  • 等結合の演算結果から重複する列を排除して取り出される。
  • 自然結合演算 = 直積演算 + 選択演算 + 射影演算 で表現できる。
SELECT 社員コード,社員名,電話番号,所属.所属コード,部署名 FROM 社員,所属 WHERE 社員.所属コード = 所属.所属コード;

※ SELECT * FROM 社員 NATURAL JOIN 所属; でも可。
社員コード 社員名 電話番号 所属コード 部署名
00001 ホムペ太郎 03-0000-1111 01 情報発信部
00002 ブログ次郎 06-9999-2222 01 情報発信部
00003 ソシャ三郎 045-888-3333 02 情報共有部

◇外部結合

  • 片方または両方のテーブルに存在するすべての行を対象とする結合である。
  • 結合する一方の表に値のないデータも取り出せる。

[社員]

社員コード 社員名
00001 ホムペ太郎
00002 ブログ次郎
00003 ソシャ三郎

[受講]

社員コード 研修名
00001 HTMLタグ入門
00001 Wiki文法入門
00002 Wiki文法入門
SELECT 社員.社員コード,社員名,研修名 FROM 社員 LEFT JOIN 受講 ON 社員.社員コード = 受講.社員コード;

※左外部結合の例である。

社員コード 社員名 研修名
00001 ホムペ太郎 HTMLタグ入門
00001 ホムペ太郎 Wiki文法入門
00002 ブログ次郎 Wiki文法入門
00003 ソシャ三郎

  • データベースの割り算であり、表Aと表Bの商は、A÷Bと表す。
  • A÷Bを求める手順は以下の通り。

◇表Bが1行の場合

[表A]

社員コード 社員名 資格コード
00001 ホムペ太郎 01
00002 ブログ次郎 01
00001 ホムペ太郎 02
00002 ブログ次郎 03

[表B]

社員コード 社員名
00001 ホムペ太郎

まず、表Bとまったく同じ行を抜き出す。

社員コード 社員名 資格コード
00001 ホムペ太郎 01
00001 ホムペ太郎 02

次に、表Bの属性を取り除く。

資格コード
01
02

◇表Bが2行以上の場合

[表A]

社員コード 社員名 資格コード
00001 ホムペ太郎 01
00002 ブログ次郎 01
00001 ホムペ太郎 02
00002 ブログ次郎 03

[表B]

社員コード 社員名
00001 ホムペ太郎
00002 ブログ次郎

まず、表Bとまったく同じ行を抜き出す。

社員コード 社員名 所属コード
00001 ホムペ太郎 01
00002 ブログ次郎 01
00001 ホムペ太郎 02
00002 ブログ次郎 03

次に、表Bの属性以外で同じ値の行を抜き出す。

社員コード 社員名 所属コード
00001 ホムペ太郎 01
00002 ブログ次郎 01

次に、表Bの属性を取り除く。

資格コード
01
01

同じ値は1行にまとめる。

資格コード
01

商の結果×表Bで検算し、表Aに同じ行があれば正しい商演算結果である。


【試験対策】

◇内部結合

  • FROM句:直積、WHERE句:選択、SELECT句:射影、で行なう。
  • テーブル間の値の一致に基ずく。

◇外部結合

  • 左外部結合が主であるが、右外部結合、完全外部結合も簡単に覚えておくこと。

目次へ戻る