04.02.2013 Aufrufe

Aufgabe 1 - Datenbanksysteme - TUM

Aufgabe 1 - Datenbanksysteme - TUM

Aufgabe 1 - Datenbanksysteme - TUM

MEHR ANZEIGEN
WENIGER ANZEIGEN

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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!