\documentclass{bschlangaul-aufgabe}
\bLadePakete{mathe,syntax}
\begin{document}
\bAufgabenMetadaten{
  Titel = {Bundesliga-Datenbank},
  Thematik = {Bundesliga-Datenbank},
  Referenz = DB.Relationales-Modell.Relationale-Algebra.Bundesliga-Datenbank,
  RelativerPfad = Module/10_DB/30_Relationales-Modell/20_Relationale-Algebra/Aufgabe_Bundesliga-Datenbank.tex,
  ZitatSchluessel = db:ab:7,
  ZitatBeschreibung = {Relationale Algebra und SQL, Aufgabe 4},
  BearbeitungsStand = mit Lösung,
  Korrektheit = unbekannt,
  Ueberprueft = {unbekannt},
  Stichwoerter = {Relationale Algebra, SQL, Entity-Relation-Modell},
}

Gegeben sei die folgende Bundesliga-Datenbank, in der die Vereine,
Spiele, Trainer und Spieler mit ihren Einsätzen für die laufende Saison
verwaltet werden:\index{Relationale Algebra}
\index{SQL}
\footcite[Relationale Algebra und SQL, Aufgabe 4]{db:ab:7}

\begin{itemize}
\item VEREIN (VNAME, ORT, PRÄSIDENT)
\item SPIELE (HEIM, GAST, RESULTAT, ZUSCHAUER, TERMIN, SPIELTAG, H-TRAINER,
G-TRAINER)
\item SPIELER (SPNR, NAME, VORNAME, VEREIN, ALTER, GEHALT, GEB-ORT)
\item TRAINER (TRNR, NAME, VORNAME, VEREIN, ALTER, GEHALT, GEB-ORT)
\item EINSATZ (HEIM, GAST, SPNR, VON, BIS, TORE, KARTE)
\end{itemize}

\begin{enumerate}
\item Zeichnen Sie das „zugehörige“ ER-Modell!
\index{Entity-Relation-Modell}

\item Formulieren Sie folgende Anfragen in relationaler Algebra und in
SQL:

\begin{itemize}
\item Welche Spieler haben beim Spiel TSV 1860 München – FC Bayern
München mitgewirkt?

\begin{bAntwort}
$\pi_{\text{NAME,VORNAME}}(
  \text{Spieler}
  \bowtie
  (\sigma_{
    \text{HEIM} = \mlq \text{TSV 1860 München} \mrq \land
    \text{GAST} = \mlq \text{FC Bayern München} \mrq
  }(\text{Einsatz}))
)$

\begin{minted}{sql}
SELECT NAME, VORNAME FROM Spieler, Einsatz,
WHERE
  HEIM = 'TSV 1860 München' AND GAST = 'FC Bayern München' AND
  Einsatz.SPNR = Spieler.SPNR;
\end{minted}
\end{bAntwort}

%%
%
%%

\item Welche Spiele sind 2 : 0 ausgegangen?

\begin{bAntwort}
$\pi_{\text{HEIM},\text{GAST},\text{SPIELTAG}}(\sigma_{\text{RESULTAT} = \mlq 2 : 0 \mrq}(\text{SPIELE}))$

\begin{minted}{sql}
SELECT HEIM, GAST, SPIELTAG FROM SPIELE
WHERE RESULTAT = '2 : 0';
\end{minted}
\end{bAntwort}

%%
%
%%

\item Welche Spieler spielen in einem Verein ihres Geburtsortes?

\begin{bAntwort}
$\pi_{\text{NAME},\text{VORNAME}}(
  \text{VEREIN}
  \bowtie_{\text{VEREIN.ORT} = \text{SPIELER.GEB-ORT} \land \text{SPIELER.VEREIN} = \text{VEREIN.VNAME}}
  \text{SPIELER}
)$

\begin{minted}{sql}
SELECT NAME, VORNAME
FROM SPIELER, VEREIN
WHERE VEREIN.ORT = SPIELER.GEB-ORT AND SPIELER.VEREIN = VEREIN.VNAME;
\end{minted}
\end{bAntwort}

%%
%
%%

\item Welche Spieler vom 1. FC Köln haben alle Spiele mitgemacht?

\begin{bAntwort}
\def\tmpkoeln{\mlq \text{1. FC Köln} \mrq}

\begin{multline*}
\pi_{\text{NAME,VORNAME}}(\\
  \sigma_{\text{VEREIN} = \tmpkoeln}(\text{SPIELER})\\
  \bowtie\\
  (
    \pi_{\text{HEIM,GAST,SPNR}}(\sigma_{\text{HEIM} = \tmpkoeln \lor \text{GAST} = \tmpkoeln}(\text{EINSATZ}))\\
    \div\\
    \pi_{\text{HEIM,GAST}}(\sigma_{\text{HEIM} = \tmpkoeln \lor \text{GAST} = \tmpkoeln}(\text{SPIELE}))
  )
)
\end{multline*}

\begin{minted}{sql}
SELECT NAME, VORNAME
FROM SPIELER
WHERE VEREIN = '1. FC Koeln' AND SPNR IN (
  SELECT SPNR
  FROM EINSATZ
  WHERE HEIM = '1. FC Koeln' OR GAST = '1. FC Koeln'
  GROUP BY SPNR
  HAVING COUNT(*) = (
    SELECT COUNT(*)
    FROM SPIELE
    WHERE HEIM = '1. FC Koeln' OR GAST = '1. FC Koeln'
  )
);
\end{minted}
\end{bAntwort}

%%
%
%%

\item Wie heißen die Präsidenten der Vereine, die zur Zeit einen Trainer
beschäftigen, der jünger ist als der älteste Spieler, der beim Verein
beschäftigt ist?

\begin{bAntwort}
\begin{multline*}
\pi_{\text{PRÄSIDENT}}(\\
  \text{VEREIN}\\
  \bowtie\\
  \pi_{\text{VEREIN}}(\\
    \text{TRAINER}\\
    \bowtie_{
      \text{TRAINER.ALTER} < \text{SPIELTER.ALTER} \land
      \text{TRAINER.VEREIN} = \text{SPIELER.VEREIN}
    }\\
    \text{SPIELER}\\
  )\\
)
\end{multline*}

\begin{minted}{sql}
SELECT PRÄSIDENT
FROM VEREIN, SPIELER, TRAINER
WHERE
  VEREIN.VNAME = SPIELER.VEREIN AND
  VEREIN.VNAME = VEREIN.TRAINER AND
  TRAINER.ALTER < SPIELER.ALTER;
\end{minted}
\end{bAntwort}

%%
%
%%

\item Welche Spieler haben bisher noch nie gespielt?

\begin{bAntwort}
$\pi_{\text{SPNR}}(\text{SPIELER}) - \pi_{\text{SPNR}}(\text{EINSATZ})$

\begin{minted}{sql}
SELECT SPNR FROM SPIELER
EXCEPT
SELECT SPNR FROM EINSATZ;
\end{minted}
\end{bAntwort}

%%
%
%%

\item Welche Spieler haben bisher noch kein Tor geschossen?

\begin{bAntwort}
$\pi_{\text{SPNR}}(\text{SPIELER}) -
\pi_{\text{SPNR}}(\sigma_{\text{TORE} > 0}(\text{EINSATZ}))$

\begin{minted}{sql}
SELECT SPNR FROM SPIELER
EXCEPT
SELECT SPNR FROM EINSATZ WHERE TORE > 0;
\end{minted}
\end{bAntwort}

%%
%
%%

\item Welcher Trainer hat schon mehr als einen Verein trainiert? Welche
Vereine haben schon mehrere Trainer gehabt?

%%
%
%%

\begin{bAntwort}
Vereine:

\begin{minted}{sql}
SELECT HEIM FROM SPIELE l, SPIELE r
WHERE l.HEIM = r.HEIM AND NOT (l.H-TRAINER = r.H-TRAINER)
UNION
SELECT GAST FROM SPIELE l, SPIELE r
WHERE l.GAST = r.GAST AND NOT (l.G-TRAINER = r.G-TRAINER)
UNION
SELECT HEIM FROM SPIELE l, SPIELE r
WHERE l.HEIM = r.GAST AND NOT (l.H-TRAINER = r.G-TRAINER)
\end{minted}

Trainer:

\begin{minted}{sql}
SELECT H-TRAINER FROM SPIELE l, SPIELE r
WHERE l.H-TRAINER = r.HEIM AND NOT (l.HEIM = r.HEIM)
UNION
SELECT G-TRAINER FROM SPIELE l, SPIELE r
WHERE l.G-TRAINER = r.G-TRAINER AND NOT (l.GAST = r.GAST)
UNION
SELECT H-TRAINER FROM SPIELE l, SPIELE r
WHERE l.H-TRAINER = r.G-TRAINER AND NOT (l.H-TRAINER = r.G-TRAINER)
\end{minted}
\end{bAntwort}

%-----------------------------------------------------------------------
%
%-----------------------------------------------------------------------

\item Welche Spiele am 10. Spieltag hatten mehr als 30.000 Zuschauer?

\begin{bAntwort}
$\pi_{\text{HEIM,GAST}}(
  \sigma_{\text{ZUSCHAUER} > 30000 \land \text{SPIELTAG} = 10}(\text{SPIELE})
)$

\begin{minted}{sql}
SELECT HEIM, GAST
  FROM SPIELE
  WHERE ZUSCHAUER > 30000 AND SPIELTAG = 10;
\end{minted}
\end{bAntwort}
\end{itemize}
\end{enumerate}
\end{document}
