- ベストアンサー
現在データベースの勉強を独学で勉強しているのですが
質問すべき場所が適合していなければ申し訳ありません。 データベースの勉強を最近始めたのですが、以下のような問いがあり、それに対してどのような回答をすればいいのかわかりません。 是非教えていただきたく思います。 また、データベースの勉強を一から始めるにあたってどのように勉強していくのがいいのか教えていただけたら幸いです ― 問 ― バスケットボールのリーグ戦における1シーズンのデータを取るために、次の関係スキーマXとYに基づく2つの関係表を持つ関係データベースを考える。 ・選手の所属チーム情報 X (氏名、所属チーム) ・試合における得点情報 Y (氏名、所属チーム、相手チーム、得点時間) ただし、関係データベースは次の条件を満たす。 ・同じ対戦相手とは一度だけ試合をする。 ・データベース中の選手とチームは名前により一意に識別される。 ・試合の得点は得点した選手の所属チームに対し、すべて2ポイント与えられ、3ポイントやフリースロー等による1ポイントの得点はないものとする。 ・選手はシーズン中に移籍により、複数のチームに所属することがある。 ・得点開始時間は試合開始から経過時間を分単位で記録し、同じ対戦カードで同一の時間帯には複数の得点者はいないこととする。 ・どのチームにも複数の選手が所属している。 このようにデータが与えられている場合に以下の情報を求める方針を関係代数を用いて式として表せ。 また、関係代数の利用可能な演算は集合演算(和、差、積、商)、選択、直積、射影がある。 1)複数のチームに所属した選手 2)Aというチームから得点を取られたことのないチーム 3)少なくとも一試合で15分以降に得点したチーム 4)所属したことのある全ての選手がシーズンを通して得点を取ったことのないチーム
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
関係代数式は確かにデータベース理論ですが、どちらかというと情報数学というようなアカデミックな分野ですので、数学カテゴリなどの方がコメントが付きやすいかもしれません。コンピュータカテゴリはどうしても実務寄りになります。 (情報処理試験でもこういう形ではあまり出題されないと思いますしね) そういう意味では私も例外ではないので、自信があるわけではないのですが、考え方は導けるので、参考になればご覧ください。 1) 複数のチームに所属した選手 =同じ所属チーム以外の所属チームがある選手 =πX.氏名(σX.氏名=X.氏名 ∧ X.所属チーム<>X.所属チーム(X×X)) 2)Aというチームから得点を取られたことのないチーム =すべてのチーム-Aというチームから得点を取られたチーム =π所属チーム(X)-π相手チーム(σ所属チーム='A'(Y)) 3)少なくとも一試合で15分以降に得点したチーム =15分以降に得点したことのあるチーム =π所属チーム(σ得点時間>=15(Y)) 4)所属したことのある全ての選手がシーズンを通して得点を取ったことのないチーム =すべてのチームー得点をとったことのあるチーム =π所属チーム(X)-π所属チーム(Y) 結合は使えないようなので、πは射影、σは選択です(機種依存文字でないことを祈ります) 1)は本当は属性名変更しないとダメな気がするのですが。。 =π氏名(σ氏名=氏名1 ∧ 所属チーム<>所属チーム1(X×(δ氏名←氏名1,所属チーム←所属チーム1(X))))
その他の回答 (1)
- jamshid6
- ベストアンサー率88% (591/669)
実際のデータベースは集合演算ではないので、射影ではDISTINCTをつけて重複を排除します。また、結合も要約も実装されているので、書き方も変わってきます。 今回の例では、そのまま関係代数式っぽく書くと 1)SELECT DISTINCT X.氏名 FROM X, X AS X1 WHERE X.氏名=X1.氏名 AND X.所属チーム<>X1.所属チーム 2)SELECT DISTINCT 所属チーム FROM X EXCEPT SELECT DISTINCT 相手チーム FROM Y WHERE 所属チーム='A' 3)SELECT DISTINCT 所属チーム FROM Y WHERE 得点時間>=15 4)SELECT DISTINCT 所属チーム FROM X EXCEPT SELECT DISTINCT 所属チーム FROM Y となりますが、1)2)4)については実際は、以下のようにします。 1)SELECT 氏名 FROM X GROUP BY 氏名 HAVING COUNT(*)>1 2)SELECT DISTINCT 所属チーム FROM X WHERE 所属チーム NOT IN (SELECT 相手チーム FROM Y WHERE 所属チーム='A') 3)SELECT DISTINCT 所属チーム FROM X WHERE 所属チーム NOT IN (SELECT 所属チーム FROM Y)
お礼
2度もの回答ありがとうございました。 お手数をおかけしてしまい申し訳ありません・・・ SQLと関係代数は結構かき方が違うものなのですね。 勉強することが増え、大変だと思うと同時に熱意が沸いてきたように感じます。 これからも頑張ってデータベースの知識を深めていこうと思います。 本当に回答ありがとうございました!
お礼
丁寧な回答ありがとうございます。 やはり、この質問内容だとカテゴリが微妙なんですね・・・ もし、上記の質問内容をSQLで示す場合はどうなるか、という質問ならこのカテゴリなんでしょうか? もしそうであれば、SQLでの書き方を教えてもらえたら幸いです