\documentclass{bschlangaul-aufgabe} \bLadePakete{syntax,rmodell} \begin{document} \bAufgabenMetadaten{ Titel = {Aufgabe 3}, Thematik = {Vater und Mutter}, Referenz = 66116-2015-H.T1-TA1-A3, RelativerPfad = Examen/66116/2015/09/Thema-1/Teilaufgabe-1/Aufgabe-3.tex, ZitatSchluessel = examen:66116:2015:09, BearbeitungsStand = mit Lösung, Korrektheit = unbekannt, Ueberprueft = {unbekannt}, Stichwoerter = {SQL, SQL mit Übungsdatenbank}, EinzelpruefungsNr = 66116, Jahr = 2015, Monat = 09, ThemaNr = 1, TeilaufgabeNr = 1, AufgabeNr = 3, } \let\a=\bAttribut \let\f=\bFremd \let\p=\bPrimaer \let\r=\bRelationMenge \noindent Gegeben seien folgende Relationen: \index{SQL} \footcite{examen:66116:2015:09} \begin{liRelationenSchemaFormat} Mensch(ID*, MutterID, VaterID) Mann(ID*) Frau(ID*) \end{liRelationenSchemaFormat} \begin{bRelationenModell} \r{Mensch}{\p{ID}, MutterID, VaterID} \r{Mann}{\p{ID}} \r{Frau}{\p{ID}} \end{bRelationenModell} \begin{bAdditum}[Übungsdatenbank] % Datenbankname: vater_mutter \begin{minted}{sql} CREATE TABLE Mensch ( ID INTEGER PRIMARY KEY, MutterID INTEGER, VaterID INTEGER ); CREATE TABLE Mann ( ID INTEGER PRIMARY KEY ); CREATE TABLE Frau ( ID INTEGER PRIMARY KEY ); INSERT INTO Mensch VALUES (1, 42, 41), (2, 42, 41), (3, 42, 41), (4, 42, 41), (42, NULL, 1), (41, NULL, NULL); INSERT INTO Mann VALUES (1), (3), (41); INSERT INTO Frau VALUES (2), (4), (42); CREATE VIEW VaterKind AS SELECT Mensch.VaterID, Mensch.ID as KindID FROM Mensch WHERE Mensch.VaterID IS NOT NULL; \end{minted} \index{SQL mit Übungsdatenbank} \end{bAdditum} \noindent Das zugehörige ER-Modell für dieses relationale Datenbankschema sieht folgendermaßen aus: \bigskip \noindent Bearbeiten Sie folgende Teilaufgaben: \begin{enumerate} %% % a) %% \item Finden Sie die Töchter der Frau mit ID 42. \begin{bAntwort} \begin{minted}{sql} SELECT Mensch.ID FROM Mensch, Frau WHERE Mensch.MutterID = Frau.id AND Frau.ID = 42; \end{minted} \end{bAntwort} %% % b) %% \item Gibt es Männer, die ihre eigenen Großväter sind? Formulieren Sie eine geeignete SQL-Anfrage. \begin{bAntwort} \begin{minted}{sql} SELECT Mensch.ID FROM Mann, Mensch WHERE Mensch.ID = Mann.id AND ( Mensch.VaterID IN (SELECT v.ID FROM Mensch v WHERE v.VaterID = Mensch.ID) OR Mensch.MutterID IN (SELECT v.ID FROM Mensch v WHERE v.VaterID = Mensch.ID) ); \end{minted} \end{bAntwort} %% % c) %% \item Definieren Sie eine View VaterKind (VaterID; KindID), die allen Vätern (VaterID) ihre Kinder (KinderID) zuordnet. Diese View darf keine NULL-Werte enthalten. \begin{bAntwort} \begin{minted}{sql} -- Wir erzeuge bereits beim Erstellen der Datenbank diese View, damit -- sie für spätere Aufgaben zur Verfügung steht. DROP VIEW IF EXISTS VaterKind; CREATE VIEW VaterKind AS SELECT Mensch.VaterID, Mensch.ID as KindID FROM Mensch WHERE Mensch.VaterID IS NOT NULL; SELECT * FROM VaterKind; \end{minted} \end{bAntwort} %% % d) %% \item Verwenden Sie die View aus c), um alle Väter zurückzugeben, absteigend geordnet nach der Anzahl ihrer Kinder. \begin{bAntwort} \begin{minted}{sql} SELECT VaterID, COUNT(VaterID) as Anzahl FROM VaterKind GROUP BY VaterID ORDER BY Anzahl DESC; \end{minted} \end{bAntwort} %% % e) %% \item Hugo möchte mit folgender Anfrage auf Basis der View aus c) alle kinderlosen Männer erhalten: \begin{minted}{sql} SELECT VaterID FROM VaterKind GROUP BY VaterID HAVING COUNT(KindID) = 0 \end{minted} \begin{enumerate} %% % i. %% \item Was ist das Ergebnis von Hugos Anfrage und warum? \begin{bAntwort} Die Anfrage liefert kein Ergebnis. Da die View laut Angabe keine Null-Werte enthalten darf, sind in der View nur Männer verzeichnet, die wirklich Väter sind. \end{bAntwort} %% % ii. %% \item Formulieren Sie eine Anfrage, die tatsächlich alle kinderlosen Männer zurückliefert. \begin{bAntwort} \begin{minted}{sql} SELECT * FROM Mann EXCEPT SELECT VaterID FROM VaterKind GROUP BY VaterID; \end{minted} \end{bAntwort} \end{enumerate} \end{enumerate} Hinweis: Denken Sie daran, dass SQL auch Mengenoperationen kennt. \end{document}