\documentclass{bschlangaul-aufgabe}
\bLadePakete{rmodell,syntax}
\begin{document}
\bAufgabenMetadaten{
  Titel = {Aufgabe 4},
  Thematik = {Mitarbeiter einer Abteilung},
  Referenz = 66116-2021-F.T2-TA2-A4,
  RelativerPfad = Examen/66116/2021/03/Thema-2/Teilaufgabe-2/Aufgabe-4.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 = 2,
  TeilaufgabeNr = 2,
  AufgabeNr = 4,
}

Gegeben sind folgende Relationen:\index{SQL}
\footcite{examen:66116:2021:03}

\begin{bRelationenModell}
Mitarbeiter (\bPrimaer{MitarbeiterID}, Vorname, Nachname, Adresse,
Gehalt, \bFremd{Vorgesetzter [Mitarbeiter]} NOT NULL, \bFremd{AbteilungsID[Abteilung]})

\bigskip

Abteilung (\bPrimaer{AbteilungsID}, Bezeichnung UNIQUE NOT NULL)
\end{bRelationenModell}

Verwenden Sie im Folgenden nur Standard-SQL und keine
produktspezifischen Erweiterungen. Sie dürfen bei Bedarf Views anlegen.
Geben Sie einen Datensatz nicht mehrfach aus.

% Datenbankname: Abteilung
\begin{minted}{sql}
CREATE TABLE Abteilung(
  AbteilungsID INTEGER PRIMARY KEY,
  Bezeichnung VARCHAR(30) UNIQUE NOT NULL
);

CREATE TABLE Mitarbeiter(
  MitarbeiterID INTEGER PRIMARY KEY,
  Vorname VARCHAR(30),
  Nachname VARCHAR(30),
  Adresse VARCHAR(60),
  Gehalt DECIMAL(7, 2),
  Vorgesetzter INTEGER NOT NULL REFERENCES Mitarbeiter(MitarbeiterID),
  AbteilungsID INTEGER REFERENCES Abteilung(AbteilungsID)
);

INSERT INTO Abteilung VALUES
  (1, 'Buchhaltung'),
  (42, 'Vertrieb');

INSERT INTO Mitarbeiter VALUES
  (1, 'Karl', 'Landsbach', 'Sigmaringstraße 4, 87153 Farnbach', 2467.23, 1, 42),
  (2, 'Lisa', 'Grätzner', 'Scheidplatz 6, 18434 Tullach', 5382.2, 1, 42),
  (3, 'Sarah', 'Riedel', 'Am Angera 3, 79527 Töll', 7382.2, 1, 42),
  (4, 'Franz', 'Rudolf', 'Strewitzstraße 4, 45507 Strewith', 2382.2, 1, 42),
  (5, 'Sergej', 'Puschkin', 'Radolf 4, 12507 Radstadt', 1382.2, 1, 1);

\end{minted}
\index{SQL mit Übungsdatenbank}

\begin{enumerate}

%%
% a)
%%

\item Schreiben Sie eine SQL-Anweisung, die die Tabelle Mitarbeiter
anlegt. Gehen Sie davon aus, dass die Tabelle Abteilung bereits
existiert.

\begin{bAntwort}
Siehe oben
\end{bAntwort}

%%
% b)
%%

\item Schreiben Sie eine SQL-Anweisung, die Vor- und Nachnamen der
Mitarbeiter der Abteilung mit der Bezeichnung Vertrieb ausgibt,
absteigend sortiert nach MitarbeiterID.

\begin{bAntwort}
\begin{minted}{sql}
SELECT m.Vorname, m.Nachname
FROM Mitarbeiter m, Abteilung a
WHERE
  a.AbteilungsID = m.AbteilungsID AND
  a.Bezeichnung = 'Vertrieb'
ORDER BY m.MitarbeiterID DESC;
\end{minted}
\end{bAntwort}

%%
% c)
%%

\item Schreiben Sie eine SQL-Anweisung, die Vor- und Nachnamen sowie das
Gehalt von Mitarbeitern ausgibt, die mehr verdienen als ihr Chef.
Sortieren Sie die Ausgabe absteigend nach dem Gehalt.

\begin{bAntwort}
\begin{minted}{sql}
SELECT m.Vorname, m.Nachname, m.Gehalt
FROM Mitarbeiter m, Mitarbeiter n
WHERE
  m.Vorgesetzter = n.MitarbeiterID AND
  m.Gehalt > n.Gehalt
ORDER BY m.Gehalt DESC;
\end{minted}
\end{bAntwort}

%%
% d)
%%

\item Schreiben Sie eine SQL-Anweisung, die das Gehalt von allen
Mitarbeitern aus der Abteilung mit der ID 42 um 10\% erhöht.

\begin{bAntwort}
\begin{minted}{sql}
UPDATE Mitarbeiter
SET Gehalt = Gehalt * 1.1
WHERE AbteilungsID = 42;
SELECT * FROM Mitarbeiter;
\end{minted}
\end{bAntwort}

%%
% e)
%%

\item Schreiben Sie eine SQL-Anweisung, welche den Vornamen, die
Nachnamen und das Gehalt der sieben bestbezahlten Mitarbeiter aus der
Buchhaltung ausgibt. Standardkonforme Sprachkonstrukte, die eine
Beschränkung der Ausgabe bewirken, sind erlaubt.
\index{Top-N-Query}

\begin{bAntwort}
\begin{minted}{sql}
SELECT m.Vorname, m.Nachname, m.Gehalt
FROM Mitarbeiter m, Mitarbeiter n, Abteilung a
WHERE
  m.Gehalt <= n.Gehalt AND
  a.AbteilungsID = m.AbteilungsID AND
  a.AbteilungsID = n.AbteilungsID AND
  a.Bezeichnung = 'Buchhaltung'
GROUP BY m.Vorname, m.Nachname, m.Gehalt
HAVING COUNT(*) <= 7
ORDER BY m.Gehalt DESC;
\end{minted}
\end{bAntwort}

%%
% f)
%%

\item Schreiben Sie eine SQL-Anweisung, die für jede Abteilung die
Mitarbeiter ermittelt, die am wenigsten verdienen. Dabei sollen Vorname,
Nachname und die Abteilungsbezeichnung der Mitarbeiter ausgegeben
werden.

\begin{bAntwort}
\begin{minted}{sql}
SELECT m.Vorname, m.Nachname, m.Gehalt, a.Bezeichnung
FROM Mitarbeiter m, Mitarbeiter n, Abteilung a
WHERE
  m.Gehalt >= n.Gehalt AND
  m.AbteilungsID = n.AbteilungsID AND
  m.AbteilungsID = a.AbteilungsID
GROUP BY m.Vorname, m.Nachname, m.Gehalt, m.AbteilungsID, a.Bezeichnung
HAVING COUNT(*) <= 1
ORDER BY m.Gehalt DESC;
\end{minted}
\end{bAntwort}
\end{enumerate}

\end{document}
