講義/早稲田大学/データベース設計/SQL/演習
提供: fukudat
目次 |
演習1
右のERモデルを表現する次のようなスキーマを持つデータベースが与えられている. 以下を求めるSQL文を書け.
酒(名前, 製造元) 呑み屋(名前, 住所, 定休日) 酒呑み(名前, 住所) 好き(酒呑み, 酒) 売る(呑み屋, 酒, 値段) 行きつけ(酒呑み, 呑み屋, 頻度)
- 製造元が"朝日酒造" である酒の名前のすべて.
- "養老の瀧" という名前の呑み屋の定休日.
- "つぼ八" という名前の呑み屋で販売されている酒の名前のすべて.
- "魚民" という名前の呑み屋で売られている "一番絞り" という名前の酒の値段.
- "新宿" に住んでいる酒呑みが好きな酒を造っている酒の製造元すべて.
- 酒呑みが行きつけの呑み屋の名前と、そこで売られているその酒呑みが好きな酒とその値段.
- 酒の製造元の総数.
- 各酒の製造元が作っている酒の数.
- 3つ以上の呑み屋で売られている酒の名前すべて.
- 一番たくさんの酒呑みに好かれている酒を一番安く売っている呑み屋の名前.
- 平均より多くの種類の酒を製造している製造元
演習2
リレーション に対する問い合わせで,関数従属性
が成り立っているとき,そのときに限り,結果が空になる SQL 文を考えよ.
演習3
二つのリレーション の anti-semijoin とは,
と
を join したときにダングリングタプル(dangling tuples; join する相手のいないタプル) となるタプルだけを返す演算である.
と
のキーが
であるとき,以下の SQL文のうち正しく anti-semijoin を実現しているものを選べ(複数あるかもしれない).
select * from R where <A,B> not in (select A,B from S) |
select R.* from R,S where R.A <> S.A and R.B <> S.B |
select R.* from R,S where R.A <> S.A or R.B <> S.B |
select * from R where not exists (select * from S where S.A = R.A and S.B = R.B) |
select * from R where not exists (select * from S where S.A = R.A or S.B = R.B) |
select * from R where A <>any (select A from S) and B <>any (select B from S) |
select * from R where A <>all (select A from S) or B <>all (select B from S) |
select * from R where 1 > (select count(*) from S where S.A = R.A and S.B = R.B) |
演習4
学生の毎日の摂取カロリーを記録したリレーション 学生, 専攻, 日付, カロリー
を考える.
ここで,次の条件だけを仮定する.
- (学生, 日付) が
のキー.
- 関数従属性 学生
専攻 が成り立つ.
(問1) 専攻ごとの平均よりも多くのカロリーを摂取している学生を求める SQL文を考えよ.答えは正確なだけでなく,できるだけ簡潔にせよ.
(問2) はBCNFか? もしそうなら,BCNFでなくなるような条件を示せ.もしそうでないなら,BCNF になるように分解せよ.
(問3) 条件2の代わりに,多値従属性 学生専攻 が成り立つとする.このとき
は 4NF か?