\documentclass{bschlangaul-aufgabe} \bLadePakete{syntax,rmodell} \begin{document} \bAufgabenMetadaten{ Titel = {Aufgabe 6}, Thematik = {Fußballweltmeisterschaft}, Referenz = 66116-2021-F.T1-TA2-A6, RelativerPfad = Examen/66116/2021/03/Thema-1/Teilaufgabe-2/Aufgabe-6.tex, ZitatSchluessel = examen:66116:2021:03, BearbeitungsStand = mit Lösung, Korrektheit = unbekannt, Ueberprueft = {unbekannt}, Stichwoerter = {SQL, SQL mit Übungsdatenbank, Top-N-Query}, EinzelpruefungsNr = 66116, Jahr = 2021, Monat = 03, ThemaNr = 1, TeilaufgabeNr = 2, AufgabeNr = 6, } \begin{liRelationenSchemaFormat} Nation (Land*, Kapitän[Spieler_ID], Trainer) Spiel (Spiel_ID*, Ort, Datum, Team1[Nation], Team2[Nation], ToreTeam1, ToreTeam2) Spieler (Spieler_ID*, Name, Vorname, Wohnort, Land[Nation]) Platzverweise (Platzverweis_ID*, Spiel_ID[Spiel], Spieler_ID[Spieler], Spielminute) \end{liRelationenSchemaFormat} Gegeben ist folgendes Relationenschema zur Verwaltung von Daten aus der Fußballweltmeisterschaft: \index{SQL} \footcite{examen:66116:2021:03} Die Tabelle Match wurde in Spiel umgenannt, da es sonst zu Konfliken mit der SQL-Syntax kommt, da match ein SQL Schlüsselwort ist. Nation (Land, Kapitän, Trainer) Kapitän ist Fremdschlüssel zu Spieler\_ID in Spieler. Spiel (Spiel\_ID, Ort, Datum, Team1, Team2, ToreTeam1, ToreTeam2) Team1 ist Fremdschlüssel zu Land in Nation. Team2 ist Fremdschlüssel zu Land in Nation. Spieler (Spieler\_ID, Name, Vorname, Wohnort, Land) Land ist Fremdschlüssel zu Land in Nation. Platzverweise (Platzverweis\_ID,Spiel\_ID, Spieler\_ID, Spielminute) Spiel\_ID ist Fremdschlüsssel zu Spiel\_ID in Spiel. Spieler\_ID ist Fremdschlüssel zu Spieler\_ID in Spieler. Die Primärschlüssel der Relationen sind wie üblich durch Unterstreichen gekennzeichnet. Pro Ort und Datum findet jeweils nur ein Spiel statt. Formulieren Sie folgende Abfragen in SQL. Vermeiden Sie nach Möglichkeit übermäßige Nutzung von Joins und Views. \begin{bAdditum}[Übungsdatenbank] % Datenbankname: weltmeisterschaft \begin{minted}{sql} CREATE TABLE Spieler ( Spieler_ID INTEGER PRIMARY KEY, Name VARCHAR(20), Vorname VARCHAR(20), Wohnort VARCHAR(50), Land VARCHAR(50) ); CREATE TABLE Nation ( Land VARCHAR(50) PRIMARY KEY, Kapitän INTEGER REFERENCES Spieler(Spieler_ID), Trainer VARCHAR(50) ); CREATE TABLE Spiel ( Spiel_ID INTEGER PRIMARY KEY, Ort VARCHAR(50), Datum DATE, Team1 VARCHAR(50) REFERENCES Nation(Land), Team2 VARCHAR(50) REFERENCES Nation(Land), ToreTeam1 INTEGER, ToreTeam2 INTEGER ); CREATE TABLE Platzverweise ( Platzverweis_ID INTEGER PRIMARY KEY, Spiel_ID INTEGER REFERENCES Spiel(Spiel_ID), Spieler_ID INTEGER REFERENCES Spieler(Spieler_ID), Spielminute VARCHAR(50) ); INSERT INTO Spieler (Spieler_ID, Name, Vorname, Wohnort, Land) VALUES (1, 'Matthäus', 'Lothar', 'Herzogenaurach', 'Deutschland'), (2, 'Rizzitelli', 'Luca', 'Genua', 'Italien'), (3, 'Beckham', 'David', 'London', 'England'), (4, 'Babel', 'Markus', 'München', 'Deutschland'), (5, 'Bodden', 'Olaf', 'Kalkar', 'Deutschland'), (6, 'Häßler', 'Thomas', 'Berlin', 'Deutschland'); INSERT INTO Nation (Land, Kapitän, Trainer) VALUES ('Deutschland', 1, 'Joachim Löw'), ('Italien', 2, 'Giovanni Trapatoni'), ('England', 3, 'Boris Johnson'); INSERT INTO Spiel (Spiel_ID, Ort, Datum, Team1, Team2, ToreTeam1, ToreTeam2) VALUES (1, 'München', '2021-08-01', 'Deutschland', 'Italien', 1, 1), (2, 'Nürnberg', '2021-08-02', 'England', 'Deutschland', 1, 5), (3, 'Fürth', '2021-08-03', 'Italien', 'England', 3, 1), (4, 'Leverkusen', '2021-08-05', 'Deutschland', 'England', 3, 1); INSERT INTO Platzverweise (Platzverweis_ID, Spiel_ID, Spieler_ID, Spielminute) VALUES (1, 1, 1, 37), (2, 1, 2, 36), (3, 1, 3, 35), (4, 1, 4, 34), (5, 1, 5, 33), (6, 1, 6, 32), (7, 2, 1, 31); \end{minted} \index{SQL mit Übungsdatenbank} \end{bAdditum} \begin{enumerate} %% % a) %% \item Ermitteln Sie die Anzahl der Platzverweise pro Spieler und geben Sie jeweils Name und Vorname des Spielers mit aus. Die Ausgabe soll nach der Anzahl der Platzverweise absteigend erfolgen. \begin{bAntwort} \begin{minted}{sql} SELECT COUNT(*) AS Anzahl, s.Name, s.Vorname FROM Platzverweise p, Spieler s WHERE p.Spieler_ID = s.Spieler_ID GROUP BY s.Name, s.Vorname ORDER BY Anzahl DESC; \end{minted} \begin{minted}{md} anzahl | name | vorname --------+------------+--------- 2 | Matthäus | Lothar 1 | Bodden | Olaf 1 | Beckham | David 1 | Rizzitelli | Luca 1 | Babel | Markus 1 | Häßler | Thomas (6 rows) \end{minted} \end{bAntwort} %% % b) %% \item Welches ist die maximale Anzahl an Toren, die eine Mannschaft insgesamt im Turnier erzielt hat? (Sie dürfen der Einfachheit halber annehmen, dass jede Mannschaft jeweils mindestens einmal als Team1 und Team2 angetreten ist.) \begin{bAntwort} \begin{minted}{sql} SELECT MAX(tmp2.Summe) FROM ( SELECT Team, SUM(Summe) as Summe FROM ( SELECT Team1 AS Team, SUM(ToreTeam1) AS Summe FROM Spiel GROUP BY Team1, ToreTeam1 UNION SELECT Team2 AS Team, SUM(ToreTeam2) AS Summe FROM Spiel GROUP BY Team2, ToreTeam2 ) AS tmp GROUP BY Team ) as tmp2; \end{minted} \begin{minted}{md} max ----- 9 (1 row) \end{minted} \end{bAntwort} %% % c) %% \item Wie viele Tore sind im Turnier insgesamt gefallen? \begin{bAntwort} \begin{minted}{sql} SELECT SUM(ToreTeam1 + ToreTeam2) AS GesamtanzahlTore FROM Spiel; \end{minted} \end{bAntwort} %% % d) %% \item Ermitteln Sie die Namen und Länder der fünf Spieler, die nach der kürzesten Spielzeit einen Platzverweis erhielten. Die Ausgabe soll nummeriert erfolgen (beginnend bei 1 für die kürzeste Spielzeit). \index{Top-N-Query} \begin{bAntwort} \begin{minted}{sql} SELECT s.Name, s.Land, COUNT(*) AS Rang FROM Spieler s, Platzverweise p1, Platzverweise p2 WHERE s.Spieler_ID = p2.Spieler_ID AND p1.Spielminute <= p2.Spielminute GROUP BY s.Name, s.Land, p2.Spieler_ID HAVING COUNT(*) < 6 ORDER BY Rang; \end{minted} Der Erstplatzierte kommt durch die WHERE-Bedingungen nur einmal in der Relation vor, weil sein Eintrag genau einmal mit sich selbst vorkommt. Alle anderen Einträge, bei denen die \texttt{p2.Spieler\_ID}, der Spieler mit der „geringsten Minute“ ist, werden ja eliminiert, da ja nur die Einträge behalten werden, die der Bedingung \texttt{p1.Spielminute <= p2.Spielminute} entsprechen. \end{bAntwort} \end{enumerate} \end{document}