\documentclass{bschlangaul-aufgabe} \bLadePakete{syntax} \begin{document} \bAufgabenMetadaten{ Titel = {Aufgabe 3: SQL}, Thematik = {Universitätsverwaltung}, Referenz = 66113-2003-F.T2-A3, RelativerPfad = Examen/66113/2003/03/Thema-2/Aufgabe-3.tex, ZitatSchluessel = db:pu:2, ZitatBeschreibung = {Aufgabe 3: SQL}, BearbeitungsStand = mit Lösung, Korrektheit = unbekannt, Ueberprueft = {unbekannt}, Stichwoerter = {SQL}, EinzelpruefungsNr = 66113, Jahr = 2003, Monat = 03, ThemaNr = 2, AufgabeNr = 3, } Gegeben sei folgendes relationales Schema, das eine Universitätsverwaltung modelliert: \footcite[Aufgabe 3: SQL]{db:pu:2} \begin{minted}{md} Studenten {[MatrNr:integer, Name:string, Semester:integer]} Vorlesungen {[VorlNr:integer, Titel:string, SWS:integer, gelesenVon:integer]} Professoren {[PersNr:integer, Name:string, Rang:string, Raum:integer] } hoeren {[MatrNr:integer, VorlNr:integer]} voraussetzen {[VorgaengerVorlNr:integer, NachfolgerVorlNr:integer]} pruefen {[MatrNr:integer, VorlNr:integer, PrueferPersNr:integer, Note:decimal]} \end{minted} \noindent Formulieren Sie die folgenden Anfragen in SQL:\index{SQL} \footcite[Thema 2 Aufgabe 3]{66113:2003:03} \begin{enumerate} %% % (a) %% \item Alle Studenten, die den Professor \emph{Kant} aus einer Vorlesung kennen. \begin{bAntwort} \begin{minted}{sql} SELECT DISTINCT s.Name FROM Studenten s, Professoren p, hoeren h, Vorlesungen v WHERE p.Name = 'Kant' AND v.gelesenVon = p.PersNr AND s.MatrNr = h.MatrNr AND h.VorlNr = h.VorlNr \end{minted} \end{bAntwort} %% % (b) %% \item Geben Sie eine Liste der Professoren (Name, PersNr) mit ihrem Lehrdeputat (Summe der SWS der gelesenen Vorlesungen) aus. Ordnen Sie diese Liste so, dass sie absteigend nach Lehrdeputat sortiert ist! Bei gleicher Lehrtätigkeit dann noch aufsteigend nach dem Namen des Professors/der Professorin. \begin{bAntwort} \begin{minted}{sql} SELECT p.Name, p.PersNr, SUM(v.SWS) AS Lehrdeputat FROM Vorlesung v, Professoren p WHERE v.gelesenVon = p.PersNr GROUP BY p.Name, p.PersNr ORDER BY Lehrdeputat DESC, p.Name ASC; \end{minted} \end{bAntwort} %% % (c) %% \item Geben Sie eine Liste der Studenten (Name, MatrNr, Semester) aus, die mindestens zwei Vorlesungen bei \emph{Kant} gehört haben. \begin{bAntwort} \bPseudoUeberschrift{Mit einer VIEW} \begin{minted}{sql} CREATE VIEW hoertKant AS SELECT s.Name, s.MatrNr, s.Semester, v.VorlNr FROM Studenten s, hoeren h, Vorlesungen v, Professoren p WHERE s.MatrNr = h.MatrNr AND h.VorlNr = v.VorlNr AND v.gelesenVon = p.PersNr AND p.Name = 'Kant'; \end{minted} \begin{minted}{sql} SELECT DISTINCT h1.Name, h2.MatrNr, h1.Semester FROM hoertKant h1, hoertKant h2 WHERE h1.MatrNr = h2.MatrNr AND h1.VorlNr <> h2.VorlNr; \end{minted} oder: \begin{minted}{sql} SELECT DISTINCT Name, MatrNr, Semester FROM hoertKant GROUP BY Name, MatrNr, Semester HAVING COUNT(VorlNr) > 1; \end{minted} \bPseudoUeberschrift{In einer Abfrage} \begin{minted}{sql} SELECT s.Name, s.MatrNr, s.Semester FROM Studenten s, hoeren h, Vorlesungen v, Professoren p WHERE s.MatrNr = h.MatrNr AND h.VorlNr = v.VorlNr AND v.gelesenVon = p.PersNr AND p.Name = 'Kant' GROUP BY s.MatrNr, s.Name, s.Semster HAVING COUNT(s.MatrNr) > 1; \end{minted} \end{bAntwort} %% % (d) %% \item Geben Sie eine Liste der Semesterbesten (MatrNr und Notendurchschnitt) aus. \begin{bAntwort} \begin{minted}{sql} CREATE VIEW Notenschnitte AS ( SELECT p.MatrNr, s.Name, s.Semester, AVG(Note) AS Durchschnitt FROM Studenten s, pruefen p WHERE s.MatrNr = p.MatrNr GROUP BY p.MatrNr, s.Name, s.Semester ); SELECT a.Durchschnitt, a.MatrNr, a.Semester FROM Notenschnitte a, Notenschnitte b WHERE a.Durchschnitt >= b.Durchschnitt a.Semster = b.Semster GROUP BY a.Durchschnitt, a.MatrNr, a.Semester HAVING COUNT(*) < 2; \end{minted} \end{bAntwort} \end{enumerate} \end{document}