\documentclass{bschlangaul-aufgabe} \bLadePakete{syntax,rmodell,spalten} \begin{document} \bAufgabenMetadaten{ Titel = {Aufgabe 3}, Thematik = {Mitfahrgelegenheiten}, Referenz = 46116-2014-F.T2-TA2-A3, RelativerPfad = Examen/46116/2014/03/Thema-2/Teilaufgabe-2/Aufgabe-3.tex, ZitatSchluessel = examen:46116:2014:03, BearbeitungsStand = mit Lösung, Korrektheit = unbekannt, Ueberprueft = {unbekannt}, Stichwoerter = {SQL, SQL mit Übungsdatenbank, GROUP BY, HAVING}, EinzelpruefungsNr = 46116, Jahr = 2014, Monat = 03, ThemaNr = 2, TeilaufgabeNr = 2, AufgabeNr = 3, } { \footnotesize \begin{multicols}{2} „Kunde":\index{SQL}\footcite{examen:46116:2014:03} \begin{tabular}{|l|l|l|l|} \hline \bPrimaer{KID} & Name & Vorname & \bFremd{Stadt}\\\hline\hline K1 & Meier & Stefan & S3\\\hline K2 & Müller & Peta & S3\\\hline K3 & Schmidt & Christine & S2\\\hline K4 & Schulz & Michael & S4\\\hline \end{tabular} „Stadt" \begin{tabular}{|l|l|l|} \hline \bPrimaer{SID} & SName & Bundesland\\\hline\hline S1 & Berlin & Berlin\\\hline S2 & Nürnberg & Bayern\\\hline S3 & Köln & Nordrhein-Wesffalen\\\hline S4 & Stuttgart & Baden-Württemberg\\\hline S5 & München & Bayern\\\hline \end{tabular} \end{multicols} \begin{multicols}{2} „Angebot": \begin{tabular}{|l|l|l|l|l|} \hline \bPrimaer{KID} & \bFremd{Start} & \bFremd{Ziel} & \bPrimaer{Datum} & Plätze\\\hline\hline K4 & S4 & S5 & 08.07.2011 & 3\\\hline K4 & S5 & S4 & 10.07.2011 & 3\\\hline K1 & S1 & S5 & 08.07.2011 & 3\\\hline K3 & S2 & S3 & 15.07.2011 & 1\\\hline K4 & S4 & S1 & 15.07.2011 & 3\\\hline K1 & S5 & S5 & 09.07.2011 & 2\\\hline \end{tabular} „Anfrage": \begin{tabular}{|l|l|l|l|} \hline \bPrimaer{KID} & \bFremd{Start} & \bFremd{Ziel} & \bPrimaer{Datum}\\\hline\hline K2 & S4 & S5 & 08.07.2011\\\hline K2 & S5 & S4 & 10.07.2011\\\hline K3 & S2 & S3 & 08.07.2011\\\hline K3 & S3 & S2 & 10.07.2011\\\hline K2 & S4 & S5 & 05.07.2011\\\hline K2 & S5 & S4 & 17.07.2011\\\hline \end{tabular} \end{multicols} } % Datenbankname: mitfahrgelegenheit \begin{minted}{sql} CREATE TABLE Stadt ( SID VARCHAR(100) NOT NULL PRIMARY KEY, SName VARCHAR(100) NOT NULL, Bundesland VARCHAR(100) NOT NULL ); CREATE TABLE Anfrage ( KID VARCHAR(100) NOT NULL, Start VARCHAR(100) DEFAULT NULL REFERENCES Stadt (SID), Ziel VARCHAR(100) DEFAULT NULL REFERENCES Stadt (SID), Datum date NOT NULL, PRIMARY KEY (KID, Start, Ziel, Datum) ); CREATE TABLE Angebot ( KID VARCHAR(100) NOT NULL, Start VARCHAR(100) DEFAULT NULL REFERENCES Stadt (SID), Ziel VARCHAR(100) DEFAULT NULL REFERENCES Stadt (SID), Datum date NOT NULL, Plätze integer DEFAULT NULL, PRIMARY KEY (Datum, KID) ); CREATE TABLE Kunde ( KID VARCHAR(100) NOT NULL PRIMARY KEY, Name VARCHAR(100) DEFAULT NULL, Vorname VARCHAR(100) DEFAULT NULL, Stadt VARCHAR(100) DEFAULT NULL REFERENCES Stadt (SID) ); INSERT INTO Stadt (SID, SName, Bundesland) VALUES ('S1', 'Berlin', 'Berlin'), ('S2', 'Nürnberg', 'Bayern'), ('S3', 'Köln', 'NRW'), ('S4', 'Stuttgart', 'BW'), ('S5', 'München', 'Bayern'); INSERT INTO Anfrage (KID, Start, Ziel, Datum) VALUES ('K2', 'S4', 'S5', '2011-07-05'), ('K2', 'S4', 'S5', '2011-07-08'), ('K3', 'S2', 'S3', '2011-07-08'), ('K2', 'S5', 'S4', '2011-07-10'), ('K3', 'S3', 'S2', '2011-07-10'), ('K2', 'S5', 'S4', '2011-07-17'); INSERT INTO Kunde (KID, Name, Vorname, Stadt) VALUES ('K1', 'Meier', 'Stefan', 'S3'), ('K2', 'Müller', 'Petra', 'S3'), ('K3', 'Schmidt', 'Christine', 'S2'), ('K4', 'Schulz', 'Michael', 'S4'); INSERT INTO Angebot (KID, Start, Ziel, Datum, Plätze) VALUES ('K1', 'S1', 'S5', '2011-07-08', 3), ('K4', 'S4', 'S5', '2011-07-08', 3), ('K1', 'S5', 'S4', '2011-07-09', 2), ('K4', 'S5', 'S4', '2011-07-10', 3), ('K3', 'S2', 'S3', '2011-07-15', 1), ('K4', 'S4', 'S1', '2011-07-15', 3); \end{minted} \index{SQL mit Übungsdatenbank} \begin{enumerate} \item Formulieren Sie die folgenden Anfragen in SQL:\footcite{db:pu:wh} \begin{enumerate} %% % %% \item Geben Sie alle Attribute aller Anfragen aus, für die passende Angebote existieren! Ein Angebot ist passend zu einer Anfrage, wenn Start, Ziel und Datum identisch sind! \begin{bAntwort} \begin{minted}{sql} SELECT Anfrage.KID, Anfrage.Start, Anfrage.Ziel, Anfrage.Datum FROM Anfrage, Angebot WHERE Anfrage.Start = Angebot.Start AND Anfrage.Ziel = Angebot.Ziel AND Anfrage.Datum = Angebot.Datum; \end{minted} \end{bAntwort} %% % %% \item Finden Sie Nachnamen und Vornamen aller Kunden, für die kein Angebot existiert! \begin{bAntwort} \begin{minted}{sql} SELECT k.Name, k.Vorname FROM Kunde k WHERE NOT EXISTS ( SELECT * FROM Angebot a WHERE a.KID = k.KID ) \end{minted} oder: \begin{minted}{sql} SELECT k.Name, k.Vorname FROM Kunde k WHERE k.KID NOT IN ( SELECT KID FROM Angebot ); \end{minted} \end{bAntwort} %% % %% \item Geben Sie das Datum aller angebotenen Fahrten von München nach Stuttgart aus und sortieren Sie das Ergebnis aufsteigend! \begin{minted}{sql} SELECT Datum FROM Angebot, Stadt WHERE (SID = Start OR SID = Ziel) AND (SName = 'München' OR SName = 'Stuttgart') \end{minted} %% % %% \item Geben Sie für jeden Startort einer Anfrage den Namen der Stadt und die Anzahl der Anfragen aus. \begin{minted}{sql} SELECT SName, COUNT(*) FROM Anfrage, Stadt WHERE SID = Start GROUP BY SID; \end{minted} \end{enumerate} \item Wie sieht die Ergebnisrelation zu folgenden Anfragen auf den Beispieldaten aus?\index{GROUP BY}\index{HAVING} \begin{minted}{sql} SELECT * FROM Stadt WHERE NOT EXISTS ( SELECT * FROM Anfrage WHERE Start = SID OR Ziel = SID ) ; \end{minted} \begin{bAntwort} S1 Berlin Berlin \end{bAntwort} \begin{minted}{sql} SELECT KID, SUM (Plätze) FROM Angebot WHERE Plätze > 2 GROUP BY KID HAVING SUM (Plätze) > 4; \end{minted} \end{enumerate} \end{document}