\documentclass{bschlangaul-aufgabe} \bLadePakete{syntax} \begin{document} \bAufgabenMetadaten{ Titel = {Aufgabe 8}, Thematik = {Universitätssschema}, Referenz = 66116-2020-F.T1-TA2-A8, RelativerPfad = Examen/66116/2020/03/Thema-1/Teilaufgabe-2/Aufgabe-8.tex, ZitatSchluessel = examen:66116:2020:03, BearbeitungsStand = mit Lösung, Korrektheit = unbekannt, Ueberprueft = {unbekannt}, Stichwoerter = {SQL, SQL mit Übungsdatenbank}, EinzelpruefungsNr = 66116, Jahr = 2020, Monat = 03, ThemaNr = 1, TeilaufgabeNr = 2, AufgabeNr = 8, } Gegeben sei das Universitätssschema. Formulieren Sie folgende Anfragen in SQL-92: \index{SQL} \footcite{examen:66116:2020:03} % Datenbankname: universitaet \begin{minted}{sql} CREATE TABLE Studierende ( MatrNr INTEGER PRIMARY KEY, Name VARCHAR(15), Semester INTEGER ); CREATE TABLE Professoren ( PersNr INTEGER PRIMARY KEY, Name VARCHAR(30), Rang VARCHAR(30), Raum INTEGER ); CREATE TABLE Assistenten ( PersNr INTEGER PRIMARY KEY, Name VARCHAR(20), Fachgebiet VARCHAR(30), Boss INTEGER, FOREIGN KEY (Boss) REFERENCES Professoren(PersNr) ); CREATE TABLE Vorlesungen ( VorlNr INTEGER PRIMARY KEY, Titel VARCHAR(30), SWS INTEGER, gelesenVon INTEGER, FOREIGN KEY (gelesenVon) REFERENCES Professoren(PersNr) ); CREATE TABLE hören ( MatrNr INTEGER, VorlNr INTEGER, PRIMARY KEY(MatrNr, VorlNr), FOREIGN KEY (MatrNr) REFERENCES Studierende(MatrNr), FOREIGN KEY (VorlNr) REFERENCES Vorlesungen(VorlNr) ); CREATE TABLE prüfen ( MatrNr INTEGER, VorlNr INTEGER, PersNr INTEGER, Note INTEGER, PRIMARY KEY(MatrNr, VorlNr, PersNr), FOREIGN KEY (MatrNr) REFERENCES Studierende(MatrNr), FOREIGN KEY (VorlNr) REFERENCES Vorlesungen(VorlNr), FOREIGN KEY (PersNr) REFERENCES Professoren(PersNr) ); CREATE TABLE voraussetzen ( Vorgänger INTEGER, Nachfolger INTEGER, PRIMARY KEY(Vorgänger, Nachfolger), FOREIGN KEY (Vorgänger) REFERENCES Vorlesungen(VorlNr), FOREIGN KEY (Nachfolger) REFERENCES Vorlesungen(VorlNr) ); INSERT INTO Studierende (MatrNr, Name, Semester) VALUES (24002, 'Xenokrates', 18), (25403, 'Jonas', 12), (26120, 'Fichte', 10), (26830, 'Aristoxenos', 8), (27550, 'Schopenhauer', 6), (28106, 'Carnap', 3), (29120, 'Theophrastos', 2), (29555, 'Feuerbach', 2); INSERT INTO Professoren (PersNr, Name, Rang, Raum) VALUES (2125, 'Sokrates', 'C4', 226), (2126, 'Russel', 'C4', 226), (2127, 'Kopernikus', 'C3', 226), (2133, 'Popper', 'C3', 226), (2134, 'Augustinus', 'C3', 226), (2136, 'Curie', 'C4', 226), (2137, 'Kant', 'C4', 226); INSERT INTO Assistenten (PersNr, Name, Fachgebiet, Boss) VALUES (3002, 'Platon', 'Ideenlehre', 2125), (3003, 'Aristoteles', 'Syllogistik', 2125), (3004, 'Wittgenstein', 'Sprachtheorie', 2126), (3005, 'Rhetikus', 'Planetenbewegung', 2127), (3006, 'Newton', 'Kaplersche Gesetze', 2127), (3007, 'Spinosa', 'Gott und Natur', 2134); INSERT INTO Vorlesungen (VorlNr, Titel, SWS, gelesenVon) VALUES (4052, 'Logik', 4, 2125), (4630, 'Die 3 Kritiken', 4, 2137), (5001, 'Grundzüge', 4, 2137), (5022, 'Glaube und Wissen', 2, 2134), (5041, 'Ethik', 4, 2125), (5043, 'Erkenntnisstheorie', 3, 2126), (5049, 'Mäeutik', 2, 2125), (5052, 'Wissenschaftstheorie', 3, 2126), (5216, 'Bioethik', 2, 2126), (5259, 'Der Wiener Kreis', 2, 2133); INSERT INTO hören (MatrNr, VorlNr) VALUES (25403, 5022), (26120, 5001), (27550, 4052), (27550, 5001), (28106, 5041), (28106, 5052), (28106, 5216), (28106, 5259), (29120, 5001), (29120, 5041), (29120, 5049), (29555, 5001), (29555, 5022), (28106, 5001), (28106, 5022); INSERT INTO prüfen (MatrNr, VorlNr, PersNr, Note) VALUES (28106, 5001, 2126, 1), (25403, 5041, 2125, 2), (27550, 4630, 2137, 2), (25403, 4630, 2137, 5); INSERT INTO voraussetzen (Vorgänger, Nachfolger) VALUES (5001, 5041), (5001, 5043), (5001, 5049), (5041, 5216), (5043, 5052), (5041, 5052), (5052, 5259); \end{minted} \index{SQL mit Übungsdatenbank} \begin{enumerate} %% % %% \item Welche Vorlesungen liest der Boss des Assistenten \emph{Platon} (nur Vorlesungsnummer und Titel ausgeben)? \begin{bAntwort} \begin{minted}{sql} SELECT v.VorlNr, v.Titel FROM Vorlesungen v, Assistenten a WHERE a.Boss = v.gelesenVon AND a.Name = 'Platon'; \end{minted} \begin{minted}{md} vorlnr | titel --------+--------- 4052 | Logik 5041 | Ethik 5049 | Mäeutik (3 rows) \end{minted} \end{bAntwort} %% % %% \item Welche Studierende haben sich schon in mindestens einer direkten Voraussetzung von \emph{Wissenschaftstheorie} prüfen lassen? \begin{bAntwort} Wissenschaftstheorie (5052) $\rightarrow$ Erkenntnistheorie (5043) Ethik (5041) $\rightarrow$ Jonas (25403) \begin{minted}{sql} SELECT s.Name FROM Vorlesungen l, voraussetzen a, prüfen p, Studierende s WHERE l.Titel = 'Wissenschaftstheorie' AND l.VorlNr = a.Nachfolger AND a.Vorgänger = p.VorlNr AND p.MatrNr = s.MatrNr; \end{minted} \begin{minted}{md} name ------- Jonas (1 row) \end{minted} \end{bAntwort} %% % %% \item Wie viele Studierende hören \emph{Ethik}? \begin{bAntwort} \begin{minted}{sql} SELECT COUNT(*) FROM Vorlesungen v, hören h WHERE v.Titel = 'Ethik' AND v.VorlNr = h.VorlNr; \end{minted} \begin{minted}{md} count ------- 2 (1 row) \end{minted} \end{bAntwort} %% % %% \item Welche Studierende sind im gleichen Semester? — Geben Sie Paare von Studierenden aus. Achten Sie darauf, dass ein/e Studierende/r mit sich selbst kein Paar bildet. — Achten Sie auch darauf, dass kein Paar doppelt ausgeben wird: wenn das Paar \emph{StudentA}, \emph{StudentB} im Ergebnis enthalten ist, soll nicht auch noch das Paar \emph{StudentB}, \emph{StudentA} ausgegeben werden. \begin{bAntwort} \begin{minted}{sql} SELECT s1.Name, s2.Name FROM Studierende s1, Studierende s2 WHERE s1.Semester = s2.Semester AND s1.MatrNr < s2.MatrNr; \end{minted} \begin{minted}{md} name | name --------------+----------- Theophrastos | Feuerbach (1 row) \end{minted} \end{bAntwort} %% % %% \item In welchen Fächern ist die Durchschnittsnote schlechter als 2? Geben Sie die Vorlesungsnummer und den Titel aus. \begin{bAntwort} \begin{minted}{sql} SELECT v.VorlNr, v.Titel FROM prüfen p, Vorlesungen v WHERE p.VorlNr = v.VorlNr GROUP BY v.VorlNr, v.Titel HAVING AVG(p.Note) > 2; \end{minted} \begin{minted}{md} vorlnr | titel --------+---------------- 4630 | Die 3 Kritiken (1 row) \end{minted} \end{bAntwort} %% % %% \item Finden Sie alle Paare von Studierenden (\emph{MatrNr} duplikatfrei ausgeben), die mindestens zwei Vorlesungen gemeinsam hören. \begin{bAntwort} \begin{minted}{sql} SELECT h1.MatrNr, h2.MatrNr FROM hören h1, hören h2 WHERE h1.VorlNr = h2.VorlNr AND h1.MatrNr < h2.MatrNr GROUP BY h1.MatrNr, h2.MatrNr HAVING COUNT(*) > 1; \end{minted} \begin{minted}{md} matrnr | matrnr --------+-------- 28106 | 29120 28106 | 29555 (2 rows) \end{minted} \end{bAntwort} \end{enumerate} \end{document}