Übungsblatt 4 - Lösung - Informatik

Werbung
Universität Augsburg, Institut für Informatik
Prof. Dr. W. Kießling
Dr. A. Huhn, M. Endres, T. Preisinger
WS 2008/2009
14. Nov. 2008
Lösungsblatt 4
Datenbanksysteme I
Aufgabe 1: ER-Modellierung
Abbildung 1 zeigt eine mögliche Modellierung für ein Krankhausverwaltungssystem.
Abbildung 1: Modellierung einer Krankenhausverwaltung
Beziehungen und Konsistenzbedingungen
• Patienten sind stationär in Zimmern untergebracht.
• Zimmer sind Stationen zugeordnet und sind daher existenzabhängig zu modellieren.
• Einem Patienten sind behandelnde Ärzte zugeordnet.
• Ärzte und Pflegepersonal sind Stationen zugeordnet und von Stationspersonal abgeleitet.
• Die Beziehung zwischen Pflegepersonal und Patienten besteht nur indirekt über die Stationen.
1
Aufgabe 2: Aggregation und Gruppierung in Relationaler Algebra und SQL
Gegeben war folgende Tabelle einer Gehaltsabrechnung:
Gehaltsabrechnung
Mitarbeiter
Anton
Anton
Anton
Berta
Berta
Berta
Claus
Claus
Claus
Monat
1
2
3
1
2
3
1
2
3
Gehalt
10
20
30
10
10
10
20
20
10
Zu beantworten waren nachstehende Anfragen. Dabei ist zu beachten, dass es sich bei COUNT, SUM und AVG immer
um MULTISET GROUPBY handeln muss, damit die Duplikate nicht verloren gehen.
a) Wie hoch ist das durchschnittliche Gehalt der einzelnen Mitarbeiter?
• RA:
M U LT ISET GROU P BY (Gehaltsabrechnung, M itarbeiter, AV G, Gehalt)
• SQL:
SELECT Mitarbeiter, AVG(Gehalt)
FROM Gehaltsabrechnung
GROUP BY Mitarbeiter;
Mitarbieter
Anton
Berta
Claus
AVG(Gehalt)
20
10
16,6666667
b) Bestimmen Sie, wie oft die jeweiligen Gehälter ausbezahlt wurden.
• RA:
M U LT ISET GROU P BY (Gehaltsabrechnung, Gehalt, COU N T, Gehalt)
• SQL:
SELECT Gehalt, COUNT(Gehalt)
FROM Gehaltsabrechnung
GROUP BY Gehalt;
Gehalt
10
20
30
COUNT(Gehalt)
5
3
1
c) Wieviel Geld wurde im jeweiligen Monat insgesamt ausbezahlt?
• RA:
M U LT ISET GROU P BY (Gehaltsabrechnung, M onat, SU M, Gehalt)
• SQL:
SELECT Monat, SUM(Gehalt)
FROM Gehaltsabrechnung
GROUP BY Monat
2
Monat
1
2
3
SUM(Gehalt)
40
50
50
d) Was ist das höchste Gehalt, dass die jeweiligen Mitarbeiter jemals erhalten haben?
• RA:
GROU P BY (Gehaltsabrechnung, M itarbeiter, M AX, Gehalt)
• SQL:
SELECT Mitarbeiter, MAX(Gehalt)
FROM Gehaltsabrechnung
GROUP BY Mitarbeiter;
Mitarbeiter
Anton
Berta
Claus
MAX(Gehalt)
30
10
20
e) Bestimmen Sie das Gesamtgehalt des am schlechtesten bezahlten Mitarbeiters.
• RA: Zunächst
Pwerden die Mitarbeiter gruppiert und somit das Gesamtgehalt bestimmt. Das Ergebnis bezeichnen wir mit
X
:= M U LT ISET GROU P BY (Gehaltsabrechnung, M itarbeiter, SU M, Gehalt)
und entspricht
Mitarbeiter
Anton
Berta
Claus
SUM(Gehalt)
60
30
50
Die Aggregation MIN erfolgt ebenfalls über ein GROUPBY. Da hier eine Gruppierung allerdings nicht mehr
notwendig ist, verwenden wir als Gruppierungsattribut die leer Menge ∅, d.h.
X
M U LT ISET GROU P BY ( , ∅, M IN, SU M (Gehalt))
• SQL:
SELECT MIN(SUM(Gehalt))
FROM Gehaltsabrechnung
GROUP BY Mitarbeiter
MIN(SUM(Gehalt))
30
3
Aufgabe 3: SQL Queries
Anfragen in SQL.
1. Finden Sie die Studenten, die mindestens im neunten Semester sind.
SELECT * FROM Studenten WHERE Semester >= 9;
2. Finden Sie pro Vorlesung die jeweiligen Hörer. Geben Sie Matrikelnummer und Name des Studierenden sowie
Vorlesungsnummer und Titel der Vorlesung aus.
SELECT s.MatrNr, s.Name, v.VorlNr, v.Titel
FROM Studenten s, hören h, Vorlesungen v
WHERE s.MatrNr = h.MatrNr and h.VorlNr = V.VorlNr;
3. Finden Sie die Studierenden mit der größten Semesterzahl.
SELECT * FROM Studenten
WHERE Semester = (SELECT MAX(Semester) FROM Studenten);
4. Berechnen Sie den Umfang des Prüfungsstoffes jedes Studierenden. Es soll der Name des Studierenden und die
Summe der Semesterwochenstunden der Prüfungsvorlesungen ausgegeben werden.
SELECT s.Name, SUM(v.SWS)
FROM Studenten s, hören h, Vorlesungen v
WHERE s.MatrNr = h.MatrNr and h.VorlNr = V.VorlNr
GROUP BY s.Name;
5. Finden Sie die Namen der Studierenden, die in keiner Prüfung eine bessere Note als 3,0 hatten. Die Anfrage
SELECT s.Name
FROM Studenten s, prüfen p
WHERE s.MatrNr = p.MatrNr
AND p.Note > 3;
liefert nur Studenten, die auch schon ein Prüfung abgeschlossen haben. Es sind aber alle Studenten gesucht, die in
keiner Prüfung eine bessere Note als 3,0 erzielten. Dies schließt auch die Studenten ein, die noch überhaupt keine
Prüfung abgelegt haben. Eine korrekte Anfrage lautet somit:
SELECT s.Name, s.MatrNr
FROM Studenten s
WHERE NOT EXISTS (SELECT *
FROM prüfen p
WHERE p.MatrNr = s.MatrNr
AND p.Note < 3.0);
4
Herunterladen