「Tutorial D でリレーショナル代数」のつづき
拡張
既存の属性を元に計算した結果を関係に追加する。 SQL では SELECT 句においてカラムに演算子を適用することに相当。Date によると、
「オリジナルで定義されたリレーショナル代数の範囲を超えてしまう」
(データベース実践講義, p101より)
ために 「拡張」 と呼ばれる。
例えば、「人」 に対して、
- 年齢の 2 倍
- 男性であるかどうか?
となる属性を関係に追加したい場合は、
extend persons
add(age * 2 as DoubleAge, gender = 1 as isMale)
(対象のデータベースはこちら)
拡張の後に制限
上記の書き方を見ると SQL の方が簡単に思えるが、Tutorial D の拡張により返されるのは 「関係」 であるため、返される値に対してスムーズに制限を適用できる。
先ほどの結果に対して、
- 年齢を 2 倍したら 50 以上で、かつ、男性である人
を抽出したい場合、
extend persons add(age * 2 as DoubleAge, gender = 1 as isMale) where DoubleAge >= 50 and isMale
と書くことができる。
要約
「人」 の要素数を知りたい場合は、
summarize persons
add(count() as pCount)
最高齢の人を求めるには、対象となる属性 age を max に与える。
summarize persons
add(max(age) as pMax)
定義されている要約は summary を参照。
特定の基準で要約 - by
SQL で言う GROUP BY に相当するもの。
例えば、性別ごとの人数を得るには、
summarize persons
by {gender}
add(count() as pCount)
per を使っても上記と同じ結果が得られる。
summarize persons
per(persons {gender})
add(count() as pCount)
ただし、これだと書くのが面倒なので、上記のように by が定義されているのかな。
他の関係変数と組み合わせる - per
per は別の関係変数と組み合わせたときに有用。
例えば、「割当て」 を 「人」 の id ごとにカウントしたい場合に by を使うと、
summarize assignments
by {p_id}
add(count() as pCount)
当然ながら、「割当て」 がされてない人は表示されない。
これに対し、「人」 を基準にして 「割当て」 を要約すると、
summarize assignments
per((persons rename(id as p_id)) {p_id})
add(count() as pCount)
「割当て」 がされてない人も表示される。
by と per の定義については、summarize の per_or_by を参照。
「Tutorial D で外部キーの定義 - 整合性制約で記述」につづく
![311-12-2010CropperCapture[3] 311-12-2010CropperCapture[3]](http://lh5.ggpht.com/_2IbZQWoiKQ0/TN0gynO90aI/AAAAAAAAAuk/aKnvW5JhF0Q/311122010CropperCapture34.png?imgmax=800)
![411-12-2010CropperCapture[4] 411-12-2010CropperCapture[4]](http://lh6.ggpht.com/_2IbZQWoiKQ0/TN0gzWIP1QI/AAAAAAAAAuo/n3UmDsQYMfw/411122010CropperCapture43.png?imgmax=800)
![511-12-2010CropperCapture[5] 511-12-2010CropperCapture[5]](http://lh6.ggpht.com/_2IbZQWoiKQ0/TN0gz7D5v6I/AAAAAAAAAus/J4jlrJ32zns/511122010CropperCapture53.png?imgmax=800)
![611-12-2010CropperCapture[6] 611-12-2010CropperCapture[6]](http://lh4.ggpht.com/_2IbZQWoiKQ0/TN0g0SNF6iI/AAAAAAAAAuw/wjz6jO4wQ5g/611122010CropperCapture63.png?imgmax=800)
![811-12-2010CropperCapture[8] 811-12-2010CropperCapture[8]](http://lh5.ggpht.com/_2IbZQWoiKQ0/TN0g0yS4VoI/AAAAAAAAAu0/FjZWVqsKmck/811122010CropperCapture83.png?imgmax=800)
![711-12-2010CropperCapture[7] 711-12-2010CropperCapture[7]](http://lh6.ggpht.com/_2IbZQWoiKQ0/TN0g1cfHX6I/AAAAAAAAAu4/Mo-ODDXwUxM/711122010CropperCapture73.png?imgmax=800)
0コメント:
コメントを投稿