\documentclass{bschlangaul-aufgabe} \bLadePakete{syntax,mathe} \begin{document} \bAufgabenMetadaten{ Titel = {2. Anfragen}, Thematik = {Browser-Online-Spiele}, Referenz = 46116-2013-F.T1-TA2-A2, RelativerPfad = Examen/46116/2013/03/Thema-1/Teilaufgabe-2/Aufgabe-2.tex, ZitatSchluessel = examen:46116:2013:03, ZitatBeschreibung = {Thema 1 Teilaufgabe 2 Aufgabe 2}, BearbeitungsStand = mit Lösung, Korrektheit = unbekannt, Ueberprueft = {unbekannt}, Stichwoerter = {Relationale Algebra, SQL, Tupelkalkül}, EinzelpruefungsNr = 46116, Jahr = 2013, Monat = 03, ThemaNr = 1, TeilaufgabeNr = 2, AufgabeNr = 2, } \section{2. Anfragen \index{Relationale Algebra} \footcite[Thema 1 Teilaufgabe 2 Aufgabe 2]{examen:46116:2013:03} } Zu einer Website, auf der Besucher im Browser Online-Spiele spielen können, liegt das folgende relationale Schema einer Datenbank vor: \bigskip { \ttfamily \noindent Team : \{[\underline{TNr}, Name, Teamfarbel]\}\\ Spieler : \{[\underline{SNr}, Name, Icon, TNr, EMail]\}\\ Minispiel : \{[\underline{MNr}, Name, Kategorie, Schwierigkeit]\}\\ Wettkampf : \{[\underline{WNr}, Sieger, Geschlagener, MNr, Dauer]\}\\ } \bigskip Auf der Website treten jeweils zwei Spieler gegeneinander in Minispielen an. In diesen ist es das Ziel, den gegnerischen Spieler in möglichst kurzer Zeit zu besiegen. Minispiele gibt es dabei in verschiedenen Schwierigkeitsstufen („leicht“, „mittel“, „schwer“, „sehr schwer“) und verschiedenen Kategorien („Denkspiel“, „Geschicklichkeitsspiel“, usw.). Die Attribute \emph{Sieger} und \emph{Geschlagener} sind jeweils Fremdschlüsselattribute, die auf das Attribut \emph{SNr} der Relation \emph{Spieler} verweisen. Beachten Sie, dass das Dauer-Attribut der Wettkampf-Relation die Dauer eines Wettkampfes in der Einheit Sekunden speichert. \footcite{db:ab:examen-rs-2013-03} \begin{enumerate} %% % a) %% \item Formulieren Sie geeignete Anfragen in relationaler Algebra für die folgenden Teilaufgaben: \begin{enumerate} %% % i. %% \item Geben Sie die \emph{Namen} der \emph{Minispiele} zurück, die zur \emph{Kategorie} \emph{„Denkspiele“} zählen. \begin{bAntwort} $ \pi_{\text{Name}}( \sigma_{\text{Kategorie} = \mlq \text{Denkspiele} \mrq}(\text{Minispiele}) ) $ \end{bAntwort} %% % ii. %% \item Geben Sie die \emph{Namen} und \emph{E-Mail-Adressen} aller Spieler zurück, die in einem Minispiel des Typs \emph{„Geschicklichkeitsspiel“} gewonnen haben. \end{enumerate} \begin{bAntwort} $ \pi_{\text{Spieler.Name,Spieler.Email}}( \sigma_{\text{Kategorie} = \mlq \text{Geschicklichkeitsspiel} \mrq}(\text{Minispiele}) \bowtie_{\text{Minispiel.MNr} = \text{Wettkampf.MNr}} \text{Wettkampf} \bowtie_{\text{Wettkampf.Sieger} = \text{Spieler.SNr}} \text{Spieler} ) $ \end{bAntwort} %% % b) %% \item Formulieren Sie geeignete SQL-Anfragen\index{SQL} für die folgenden Teilaufgaben. Beachten Sie dabei, dass Ihre Ergebnisrelationen keine Duplikate enthalten sollen. \begin{enumerate} %% % i. %% \item Geben Sie jede Spielekategorie aus, für die ein Minispiel der Schwierigkeitsstufe sehr schwer vorhanden ist. \begin{bAntwort} \begin{minted}{sql} SELECT DISTINCT Kategorie FROM Minispiel WHERE Schwierigkeit = 'sehr schwer'; \end{minted} \end{bAntwort} %% % ii. %% \item Geben Sie die Wettkämpfe aus, deren Dauer unter der durchschnittlichen Dauer der Wettkämpfe liegt. \begin{bAntwort} \begin{minted}{sql} SELECT WNr FROM Wettkampf WHERE Dauer < ( SELECT AVG(Dauer) FROM Wettkampf ); \end{minted} \end{bAntwort} %% % iii. %% \item Geben Sie für jeden \emph{Spieler} seine \emph{SNr}, seinen \emph{Namen}, die Anzahl seiner Siege, die durchschnittliche Dauer seiner siegreichen Wettkämpfe und die Anzahl der Teams, aus denen er bereits mindestens einen Spieler besiegt hat, zurück. \begin{minted}{sql} SELECT SNr, Name, ( SELECT COUNT(*) FROM Wettkampf WHERE Wettkampf.Sieger = SNr ) AS Anzahl_Siege, ( SELECT AVG(Dauer) FROM Wettkampf WHERE Wettkampf.Sieger = SNr ), ( SELECT COUNT(DISTINCT Team.TNr) FROM Team, Spieler, Wettkampf WHERE Team.TNr = Spieler.TNr AND Wettkampf.Geschlagener = Spieler.SNr AND Wettkampf.Sieger = SNr ) FROM Spieler; \end{minted} \begin{bAntwort} \begin{minted}{sql} SELECT s.SNR, s.Name, COUNT(*) AS AnzahlSiege, AVG(w.Dauer) AS DurchschnittlicheWettkampfdauer, COUNT(DISTINCT g.TNr) AS TeamsBesiegt FROM Spieler s, Wettkampf w, Spieler g WHERE s.SNr = w.Sieger AND g.SNr = w.Geschlagener GROUP BY s.SNR, s.Name; \end{minted} \end{bAntwort} \end{enumerate} %% % c) %% \item Verwenden Sie den relationalen Tupelkalkül\index{Tupelkalkül}, um die folgenden Anfragen zu formulieren: \begin{enumerate} %% % i. %% \item Finden Sie die Namen der Spieler des Teams Dream Team. %% % ii. %% \item Geben Sie die Namen der Minispiele zurück, bei denen bereits Spieler gegeneinander angetreten sind, deren Teams dieselbe Teamfarbe haben. \end{enumerate} \end{enumerate} Hinweis: Die Anfragen im relationalen Tupelkalkül dürfen auch nicht sicher sein. \end{document}