テーブル代数の演算をSQL風な構文で書くことにする。なんでもかんでも突っ込んで肥大してしまったselect文を機能ごとに分解する。
基本的な文
- set文 {|}
- union文 ∪
- intersection文 ∩
- join文 △
- rearrage文 >>
set文は集合の内包的表記と100%同じで、union, intersectionは対応する集合演算そのもの。joinはカラム名なしで実行する等値〈等価〉ジョイン〈equi-join〉。rearrange文は関数による後結合=前送り。構文は:
- set of 変数リスト in 集合リスト where 条件 end
- union of テーブルリスト on 集合リスト end
- intersection of テーブルリスト on 集合リスト end
- join(k) of テーブル, テーブル end
- rearrage from テーブルリスト columns カラム仕様 end
SQLとの関係は:
- SQL select文は、rearrage, joinの機能を持っている。もちろんselect文はそれ以上の機能も持つ。
- SQL unionは中置演算子構文だが、union of は前置。
- SQL intersetは中置演算子構文だが、intersection of は前置。
- endを明示的に付ける。
ERスキーマでは、集合(対象集合)と関係は区別する。テーブルは特殊な関係だが、集合の部分集合としても実現・解釈できる。部分集合解釈により、set, union, intersection の意味も解釈される。joinも部分集合で解釈可能だが、SQL風のテーブル操作の直感に頼るのがいいのかも知れない。rearrageは関係・関数解釈がふさわしい。
テーブルが、「特殊な関係」と「対象であるタプル集合の部分集合」という二面性を持つ。このため次の四者が混同される。
- 実体の母集合
- 実体の状態である関係
- 実体の状態である部分集合
- 実体を中心に編成されたテーブル
実体の状態である関係と実体の状態である部分集合は適宜混同(同一視)してもよいが、実体の母集合、実体を中心に編成されたテーブルはまったくの別ものである。次の記法で区別しよう。
- E_実体名
- r_実体名
- e_実体名
- t_実体名
プロファイルを見ると:
- r_実体名 : E_1→E_実体名
- e_実体名 ⊆ E_実体名
- t_実体名 : E_1→E_実体名, …
例:
- e_学生 : E_1→E_学生
- t_学生 : E_1→E_学生, D_整数, D_文字列
意味:
- 《e_学生》 : 〚E_1〛→〚E_学生〛
- 《t_学生》 : 〚E_1〛→〚E_学生〛×〚D_整数〛×〚D_文字列〛
全体構文
文は演算子を表すので、被演算項〈オペランド〉として、基本テーブル名(e_名前、r_名前)が必要。また、基本集合名(D_ドメイン名、E_実体名=実体名の母集合解釈)も必要。組み込み関数(b_関数名)も使う。基本集合名、組み込み関数名は、評価されても関係ではないが、基本テーブル名は評価されるとテーブル関係になる。
基本文は演算子だが、結果(値)はすべてテーブル(テーブル関係またはテーブル部分集合)になる。値としてのテーブルは、テーブル変数に代入してよい。局所的テーブル変数を使う構文として、let文〈let式〉を使ってよい。
- let 変数束縛リスト in 文 end