5  操作記述

Young man, in mathematics you don’t understand things. You just get used to them.

– John von Neumann

5.1 学習目標

  • 和両立を理解し,与えられたリレーションが和両立か判定できる.
  • リレーション代数の基本演算を理解し,計算できる.
  • 与えられたリレーションに対して,目的に応じた演算を適用できる.

5.2 リレーショナル代数

リレーショナル代数(relational algebra)はエドガー・F・コッドによって提案された,リレーションとして表現されたデータを操作するための代数的な演算の体系である.それを実装したデータベース言語はSQLである.

リレーション代数は次の基本演算から構成される.

  • 和集合演算
  • 差集合演算
  • 共通集合演算
  • 直積演算
  • 射影演算
  • 選択演算
  • 結合演算
  • 商演算

5.2.1 和両立

定義 5.1 リレーション R(A_1, A_2, \ldots, A_n) とリレーション S(B_1, B_2, \ldots, B_m) が和両立(union compatible)とは,次の二つの条件を満たすことである.

  1. n = m
  2. \text{dom}(A_i) = \text{dom}(B_i) であり,1 \leq i \leq n

例 5.1 ある大学の学生データベースには,2024年度入学生のデータを格納するリレーション学生2024と,2025年度入学生のデータを格納するリレーション学生2025がある.

  • 学生2024(学籍番号, 氏名, 学科)
  • 学生2025(学籍番号, 氏名, 学科)

学生2024学生2025の次数は共に3であり,それぞれの属性の定義域は共通であるため,これらは和両立である.

例 5.2 A社とB社の社員を表すリレーションA社の社員B社の社員がある.A社の社員が事務部と営業部のどちらかに所属するのに対し,B社の社員が開発部と研究部のどちらかに所属するとする.

  • A社の社員(社員番号, 氏名, 部署)
  • B社の社員(社員番号, 氏名, 部署)

A社とB社の部署の定義域は異なるため,これらは和両立ではない.

5.2.2 和集合演算

定義 5.2 RS を和両立なリレーションとするとき,RS の和集合は,R \cup S で書く.その定義は次の通りである.

R \cup S = \{t \mid t \in R \text{ or } t \in S\}

RS の和集合は,R または S に属するタプル全体の集合である.

例 5.3 ある大学は工学部と理学部を持っており,それぞれの学生を表すリレーション工学部学生理学部学生がある.

  • 工学部学生(学籍番号, 氏名, 学科)
  • 理学部学生(学籍番号, 氏名, 学科)

工学部学生理学部学生の和集合は,その大学の全学生を表すリレーションである.

例 5.4 ある大学のプログラミングとデータベースの授業を受講する学生を表すリレーションプログラミングデータベースがある.

プログラミング(学籍番号, 氏名, 学科)

学籍番号 氏名 学科
202464 田中花子 機械工学科
202487 山田太郎 機械工学科

データベース(学籍番号, 氏名, 学科)

学籍番号 氏名 学科
202464 田中花子 機械工学科
202490 佐藤次郎 情報工学科

プログラミングデータベースの和集合は,プログラミングまたはデータベースの授業を受講する学生を表すリレーションである.

学籍番号 氏名 学科
202464 田中花子 機械工学科
202487 山田太郎 機械工学科
202490 佐藤次郎 情報工学科

集合は異なる元の集まりであるため,重複するタプルは除かれる.

5.2.3 差集合演算

定義 5.3 RS を和両立なリレーションとするとき,RS の差集合は,R - S で書く.その定義は次の通りである.

R - S = \{t \mid t \in R \text{ and } t \notin S\}

RS の差集合は,R に属し,S に属さないタプル全体の集合である.

例 5.5  

  • プログラミング(学籍番号, 氏名, 学科)
  • データベース(学籍番号, 氏名, 学科)

プログラミングデータベースの差集合は,プログラミングの授業を受講するがデータベースの授業を受講していない学生を表すリレーションである.

5.2.4 共通集合演算

定義 5.4 RS を和両立なリレーションとするとき,RS の共通集合は,R \cap S で書く.その定義は次の通りである.

R \cap S = \{t \mid t \in R \text{ and } t \in S\}

RS の共通集合は,R にも属し,S にも属するタプル全体の集合である.

例 5.6  

  • プログラミング(学籍番号, 氏名, 学科)
  • データベース(学籍番号, 氏名, 学科)

プログラミングデータベースの共通集合は,プログラミングの授業とデータベースの授業の両方を受講する学生を表すリレーションである.

5.2.5 直積演算

定義 5.5 R(A_1, A_2, \ldots, A_n)S(B_1, B_2, \ldots, B_m) をリレーションとするとき,RS の直積は,R \times S で書く.その定義は次の通りである.

R \times S = \{(r, s) \mid r \in R \text{ and } s \in S\}

RS の直積は,R のタプルと S のタプルの全ての組み合わせの集合である.

ノート直積の属性名の表記

R(A_1, A_2, \ldots, A_n)S(B_1, B_2, \ldots, B_m) をリレーションとするとき,RS の直積 R \times S の属性名は R.A_iS.B_i で表す.

例 5.7 商品(商品番号,商品名)

商品番号 商品名
1 りんご
2 みかん

店舗(店舗番号,店舗名)

店舗番号 店舗名
A A店
B B店

商品店舗の直積は,商品と店舗の全ての組み合わせを表すリレーションである.

商品.商品番号 商品.商品名 店舗.店舗番号 店舗.店舗名
1 りんご A A店
1 りんご B B店
2 みかん A A店
2 みかん B B店

5.2.6 射影演算

定義 5.6 R(A_1, A_2, \ldots, A_n) をリレーション,R の全属性集合を \{A_1, A_2, \ldots, A_n\} の部分集合を X = \{A_{i_1}, A_{i_2}, \ldots, A_{i_m}\},ここに 1 \leq i_1 < i_2 < \ldots < i_m \leq n とする.RX 上の射影を R[X] で表す.その定義は次の通りである.

R[X] = \{t[X] \mid t \in R\}

ここに,t = (a_1, a_2, \ldots, a_n) \in R とするとき,t[X] = (a_{i_1}, a_{i_2}, \ldots, a_{i_m}) である.

例 5.8 商品(商品番号,商品名,価格)

商品番号 商品名 価格
1 りんご 100
2 みかん 80

商品の商品番号と商品名の射影は,商品番号と商品名のみを抽出したリレーションである.

商品番号 商品名
1 りんご
2 みかん

5.2.7 選択演算

定義 5.7 R(A_1, A_2, \ldots, A_n) をリレーション,A_iA_j\theta-比較可能な属性とする.ここに,\theta は比較演算子(=, \neq, <, \leq, >, \geq)である.RA_iA_j 上の \theta-選択を R\left[A_i \theta A_j\right] で表す.その定義は次の通りである.

R\left[A_i \theta A_j\right]= \{t \mid t \in R \text{ and } t[A_i] \theta t[A_j]\}

ここに,A_iA_j\theta-比較可能とは,次の2つの条件を満たすことである.

  1. \text{dom}(A_i) = \text{dom}(A_j)
  2. t[A_i] \theta t[A_j] の真か偽が定義されている

R(A_1, A_2, \ldots, A_n) の属性 A_ic に関する \theta-選択を R\left[A_i \theta c\right] で表す.

R\left[A_i \theta c\right]= \{t \mid t \in R \text{ and } t[A_i] \theta c\}

例 5.9 商品(商品番号,商品名,価格)

商品番号 商品名 価格
1 りんご 100
2 みかん 80

商品の価格が100円以上の商品を抽出するための選択演算は,次のようになる.

\text{商品}\left[\text{価格} \geq 100\right]

商品番号 商品名 価格
1 りんご 100

5.2.8 結合演算

定義 5.8 R(A_1, A_2, \ldots, A_n)S(B_1, B_2, \ldots, B_m) をリレーション,A_iB_j\theta-比較可能とする.RSA_iB_j 上の \theta-結合を R \left[A_i \theta B_j\right] S で表す.その定義は次の通りである.

R \left[A_i \theta B_j\right] S = \left\{(r, s) \mid r \in R \text{ and } s \in S \text{ and } r[A_i] \theta s[B_j]\right\}

例 5.10 社員(社員番号,社員名,部署)

社員番号 氏名 部署
1 田中 E1
2 山田 K2
3 佐藤 E1

部署(部署番号,部署名)

部署番号 部署名
E1 営業
K4 開発

\text{社員}\left[\text{部署} = \text{部署番号}\right] \text{部署} の結果は,次のようになる.

社員.社員番号 社員.氏名 社員.部署 部署.部署番号 部署.部署名
1 田中 E1 E1 営業
2 山田 K2 K2 開発
3 佐藤 E1 E1 営業

5.2.9 商演算

定義 5.9 R(A_1, A_2, \ldots, A_{n-m}, B_1, B_2, \ldots, B_m)n 次,S(B_1, B_2, \ldots, B_m)m 次(n \geq m)のリレーションとする.RS で割った商を R \div S で表す.その定義は次の通りである.

R \div S = \{t \mid t \in R(A_1, A_2, \ldots, A_{n-m}) \text{ and } \forall u \in S, (t, u) \in R\}

例 5.11 学生 テーブル

学籍番号 氏名
202401 山田太郎
202402 田中花子
202403 佐藤次郎
202404 鈴木一郎

履修 テーブル

学籍番号 科目
202401 プログラミング
202401 データベース
202402 データベース
202402 ゲーム理論
202403 プログラミング
202403 データベース

プログラミングとデータベースの両方を履修している学生を検索することを考える.このとき,科目テーブルを次のようになる.

科目

科目
プログラミング
データベース

このとき,履修 ÷ 科目 の結果は,次のようになる.

学籍番号
202401
202403

5.3 リレーショナル代数表現

実リレーション(base relation)はデータベースに実際に格納されているリレーションである.リレーション演算から得られた結果もリレーションである.そのようなリレーションを導出リレーション(derived relation)と呼ぶ.

定義 5.10 リレーショナル代数表現(Relational Algebra Expression)

  1. リレーショナルデータベースの実リレーション R は表現である.
  2. RS を表現とするとき,RS が和両立であるなら,R \cup SR - SR \cap S は表現である.
  3. RS を表現とするとき,R \times S は表現である.
  4. R を表現とするとき,R[X] は表現である.
  5. R を表現とするとき,R\left[A_i \theta A_j\right]R\left[A_i \theta c\right] は表現である.
  6. RS を表現とするとき,R \left[A_i \theta B_j\right] S は表現である.
  7. RS を表現とするとき,R \div S は表現である.
  8. 以上の定義によって得られた表現のみがリレーショナル代数表現である.

5.4 演習

下記のリレーションがあるとする.

  • 学生(学籍番号,学生名,学部)
  • 内定(学籍番号法人番号,職種)
  • 会社(法人番号,会社名,所在地)

問1 すべての学生の全データを求めよ.

学生

問2 理工学部の学生の全データを求めよ.

学生[学部 = ‘理工’]

問3 内定先を決まっている学生の学籍番号を求めよ.

内定[‘学籍番号’]

問4 内定先を決まっていない理工学部の学生の学籍番号を求めよ.

  • 学生[学部 = ‘理工’][‘学籍番号’] - 内定[‘学籍番号’]

問5 理工学部の学生の内定先の法人番号を求めよ.

((学生[‘学籍番号’ = ‘学籍番号’]内定)[学生.学部 = ‘理工’])[内定.法人番号]

問6 法人番号が’0001’の会社の内定を受けた学生の学籍番号と学生名を求めよ.

((学生[‘学籍番号’ = ‘学籍番号’]内定)[内定.法人番号 = ‘0001’])[学生.学籍番号, 学生.学生名]

5.5 練習問題

自由に設定したテーマに基づいてリレーショナルデータベースのスキーマを定義し,それを用いてすべての基本的なリレーショナル代数演算を含む例題10題を作成し,その解答を示しなさい.pdfファイルを提出すること.