Aufgabe 1 - Datenbanksysteme - TUM
Aufgabe 1 - Datenbanksysteme - TUM
Aufgabe 1 - Datenbanksysteme - TUM
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
Lösung von Blatt Nr. 6<br />
<strong>Aufgabe</strong> 1<br />
TU München, Fakultät für Informatik<br />
Lehrstuhl III: <strong>Datenbanksysteme</strong><br />
Prof. Alfons Kemper, Ph.D.<br />
Übung zur Vorlesung <strong>Datenbanksysteme</strong> im WS05/06<br />
Richard Kuntschke (Richard.Kuntschke@in.tum.de)<br />
Martin Wimmer (Martin.Wimmer@in.tum.de)<br />
Bei numerischen Argumenten können Anfragen mit all in äquivalente Anfragen ohne die Verwendung<br />
von all umgeformt werden. Geben Sie zu den drei Vergleichsoperationen >= all, = all<br />
und =all: Finde die Studenten mit den längsten Studienzeiten.<br />
select Name<br />
from Studenten<br />
where Semester >= all ( select Semester from Studenten );<br />
Äquivalente Formulierung ohne all:<br />
select Name<br />
from Studenten<br />
where Semester >= ( select max ( Semester ) from Studenten );<br />
Beispiel für
from Lohnschema l<br />
where l. Tarifgruppe = all ( select a. Tarifgruppe<br />
from Angestellte a<br />
where a. Rang = l. Rang );<br />
Äquivalente Formulierung ohne all:<br />
<strong>Aufgabe</strong> 2<br />
select *<br />
from Lohnschema<br />
except<br />
select *<br />
from Lohnschema l<br />
where l. Tarifgruppe =( select max (a. Tarifgruppe )<br />
from Angestellte a<br />
where a. Rang = l. Rang )<br />
and l. Tarifgruppe =( select min (a. Tarifgruppe )<br />
from Angestellte a<br />
where a. Rang = l. Rang );<br />
Gegeben sei folgende Anfrage:<br />
select s.∗<br />
from Studenten s<br />
where not exists<br />
(select ∗<br />
from Vorlesungen v<br />
where v.SWS = 4 and not exists<br />
(select ∗<br />
from hören h<br />
where h.VorlNr = v.VorlNr and h.MatrNr = s.MatrNr));<br />
Geben Sie eine alternative Formulierung zur Ermittlung der Studenten, die alle vierstündigen<br />
Vorlesungen gehört haben. Können Sie immer noch die Aggregatfunktion count verwenden, um<br />
dadurch auf den Existenzquantor exists ganz verzichten zu können? Die Antwort lautet ja; aber<br />
wie?<br />
Lösung<br />
select hVier . MatrNr , hVier . Name<br />
from ( select s. MatrNr , s.Name , v. VorlNr<br />
from hören h, Vorlesungen v, Studenten s<br />
where h. MatrNr = s. MatrNr<br />
and h. VorlNr = v. VorlNr and v. SWS = 4) hVier<br />
group by hVier . MatrNr , hVier . Name<br />
having count (*) = ( select count (*)<br />
from Vorlesungen<br />
where SWS =4) ;<br />
2
<strong>Aufgabe</strong> 3<br />
Bestimmen Sie für alle Studenten eine gewichtete Durchschnittsnote ihrer Prüfungen. Die Gewichtung<br />
der einzelnen Prüfungen erfolgt nach zwei Kriterien: Prüfungen zu langen Vorlesungen<br />
sollen eine größere Rolle spielen als Prüfungen zu kurzen Vorlesungen. Prüfer, die im Schnitt<br />
sehr gute Noten vergeben, führen zu einer Abwertung des Prüfungsergebnisses, während Prüfer<br />
mit im Schnitt sehr schlechten Noten das Ergebnis aufwerten. Hinweis: Komplexere Anfragen<br />
lassen sich am besten durch Sichten in einfachere Teilanfragen modularisieren.<br />
Lösung<br />
Hier sollen die Noten der Studenten gewichtet werden, d.h. eine gute Note bei einem Professor,<br />
der normalerweise immer gute Noten vergibt, soll abgewertet werden. Eine schlechte<br />
Note bei einem Professor, der normalerweise schlechte Noten vergibt, soll demgegenüber aufgewertet<br />
werden. Analog soll gelten, dass Noten für Prüfungen über kurze Vorlesungen (z.B.<br />
2 SWS) abgewertet werden, da der Lernaufwand dafür geringer war als für Prüfungen über<br />
lange Vorlesungen, die dadurch aufgewertet werden.<br />
<strong>Aufgabe</strong> 4<br />
create view ProfGewicht as<br />
select p. PersNr , alle . durchschnitt /<br />
avg (p. Note ) as gewicht<br />
from prüfen p,<br />
( select avg ( Note ) as durchschnitt<br />
from prüfen ) alle<br />
group by p. PersNr , alle . durchschnitt ;<br />
create view VorlGewicht as<br />
select v. VorlNr , alle . durchschnitt /<br />
cast ( SWS as decimal ) as gewicht<br />
from Vorlesungen v,<br />
( select avg ( SWS ) as durchschnitt<br />
from Vorlesungen ) alle ;<br />
select p. MatrNr , avg (p. Note * pg. gewicht * vg. gewicht )<br />
from prüfen p, ProfGewicht pg , VorlGewicht vg<br />
where p. PersNr = pg. PersNr<br />
and p. VorlNr = vg. VorlNr<br />
group by p. MatrNr ;<br />
Anfragen liefern beim Auftreten von Nullwerten oft unerwartete Ergebnisse. Folgende Anfragen<br />
sollen die Vorlesungen liefern, bei denen sich keiner der Sokrates-Assistenten auskennt:<br />
select ∗ from Vorlesungen<br />
select ∗ from Vorlesungen<br />
where Titel not in<br />
where not exists<br />
( select Fachgebiet from Assistenten ( select ∗ from Assistenten<br />
where Boss = 2125 )<br />
where Boss = 2125 and<br />
Fachgebiet = Titel )<br />
Wenn es nun lediglich einen Sokrates-Assistenten gibt und dieser sich noch nicht für ein Fachgebiet<br />
entschieden hat (dies also null ist), dann liefern die beiden Anfragen unterschiedliche<br />
Ergebnisse. Warum? Zeigen Sie was passiert.<br />
Lösung<br />
3
Annahme: Sokrates (PersNr = 2125) hat nur einen Assistenten, dessen Fachgebiet noch nicht<br />
gesetzt ist, d.h. der Eintrag ist null.<br />
1. Anfrage<br />
Wir betrachten nun folgende Anfrage:<br />
select * from Vorlesungen where Titel not in<br />
( select Fachgebiet from Assistenten where Boss = 2125) ;<br />
Für jeden Titel t des äußeren selects führt das not in zu folgender Verknüpfung mit dem<br />
Ergebnis RI der geschachtelten Anfrage:<br />
Tupel mit Titel t qualifiziert sich ⇔ ∀r ∈ RI :(r �= t)<br />
Die geschachtelte Anfrage berechnet als Ergebnis RI die Menge {[null]}. Es ergibt sich somit:<br />
Tupel mit Titel t qualifiziert sich ⇔ (null �= t)<br />
Das Prädikat auf der rechten Seite wird aber zu unknown evaluiert.<br />
Resultat: Somit qualifiziert sich kein Tupel aus Vorlesungen und die Ergebnismenge ist leer.<br />
2. Anfrage<br />
Wir betrachten nun die Anfrage:<br />
select * from Vorlesungen where not exists<br />
( select * from Assistenten where Boss = 2125<br />
and Fachgebiet = Titel );<br />
Für jeden Titel t des äußeren selects wird die geschachtelte Anfrage ausgeführt und das<br />
letzte Prädikat im where-Teil der geschachtelten Anfrage wird zu:<br />
null = t<br />
Dies wird stets zu unknown evaluiert, womit der where-Teil lautet:<br />
Boss = 2125 ∧ unknown<br />
Dies bedeutet, der where-Teil wird stets entweder zu unknown oder zu false ausgewertet<br />
und das Ergebnis der inneren Anfrage ist stets leer.<br />
Resultat: Die Anfrage liefert als Ergebnis alle Vorlesungen.<br />
4