SQL風にテーブル代数

テーブル代数の演算をSQL風な構文で書くことにする。なんでもかんでも突っ込んで肥大してしまったselect文を機能ごとに分解する。

基本的な文

  1. set文 {|}
  2. union文 ∪
  3. intersection文 ∩
  4. join文 △
  5. rearrage文 >>

set文は集合の内包的表記と100%同じで、union, intersectionは対応する集合演算そのもの。joinはカラム名なしで実行する等値〈等価〉ジョイン〈equi-join〉。rearrange文は関数による後結合=前送り。構文は:

  1. set of 変数リスト in 集合リスト where 条件 end
  2. union of テーブルリスト on 集合リスト end
  3. intersection of テーブルリスト on 集合リスト end
  4. join(k) of テーブル, テーブル end
  5. rearrage from テーブルリスト columns カラム仕様 end

SQLとの関係は:

  1. SQL select文は、rearrage, joinの機能を持っている。もちろんselect文はそれ以上の機能も持つ。
  2. SQL unionは中置演算子構文だが、union of は前置。
  3. SQL intersetは中置演算子構文だが、intersection of は前置。
  4. endを明示的に付ける。

ERスキーマでは、集合(対象集合)と関係は区別する。テーブルは特殊な関係だが、集合の部分集合としても実現・解釈できる。部分集合解釈により、set, union, intersection の意味も解釈される。joinも部分集合で解釈可能だが、SQL風のテーブル操作の直感に頼るのがいいのかも知れない。rearrageは関係・関数解釈がふさわしい。

テーブルが、「特殊な関係」と「対象であるタプル集合の部分集合」という二面性を持つ。このため次の四者が混同される。

  1. 実体の母集合
  2. 実体の状態である関係
  3. 実体の状態である部分集合
  4. 実体を中心に編成されたテーブル

実体の状態である関係と実体の状態である部分集合は適宜混同(同一視)してもよいが、実体の母集合、実体を中心に編成されたテーブルはまったくの別ものである。次の記法で区別しよう。

  1. E_実体名
  2. r_実体名
  3. e_実体名
  4. t_実体名

プロファイルを見ると:

  1. r_実体名 : E_1→E_実体名
  2. e_実体名 ⊆ E_実体名
  3. t_実体名 : E_1→E_実体名, …

例:

  1. e_学生 : E_1→E_学生
  2. t_学生 : E_1→E_学生, D_整数, D_文字列

意味:

  1. 《e_学生》 : 〚E_1〛→〚E_学生〛
  2. 《t_学生》 : 〚E_1〛→〚E_学生〛×〚D_整数〛×〚D_文字列〛

全体構文

文は演算子を表すので、被演算項〈オペランド〉として、基本テーブル名(e_名前、r_名前)が必要。また、基本集合名(D_ドメイン名、E_実体名=実体名の母集合解釈)も必要。組み込み関数(b_関数名)も使う。基本集合名、組み込み関数名は、評価されても関係ではないが、基本テーブル名は評価されるとテーブル関係になる。

基本文は演算子だが、結果(値)はすべてテーブル(テーブル関係またはテーブル部分集合)になる。値としてのテーブルは、テーブル変数に代入してよい。局所的テーブル変数を使う構文として、let文〈let式〉を使ってよい。

  • let 変数束縛リスト in 文 end