Blatt 5 - Universität Mannheim

Werbung
Universität Mannheim
Lehrstuhl für Praktische Informatik III
Norman May
D7 27, Raum 410
68131 Mannheim
Telefon: (0621) 181-2586
Email: [email protected]
Datenbanksysteme I, SS 2004
Lösungen zum 5. Übungsblatt
1. SQL-Anfragen: Buchladen
Formulieren Sie die folgenden Anfragen in SQL. Alle Anfragen ausser der letzten
entsprechen den Anfragen von Aufgabe 1 des letzten Übungsblatts.
(a) Zählen Sie die Namen aller Verlage auf.
(b) Finden Sie alle Buchtitel aus dem Jahr 2003.
(c) Geben Sie alle Buchtitel an, die mindestens ein Rating haben, das grösser als
3 ist.
(d) Geben Sie Nachname und Vorname aller Autoren des Buches mit dem Titel
“Es” an.
(e) Geben Sie Nachname und Vorname aller Autoren an, die mindestens ein Buch
geschrieben haben.
(f) Geben Sie für jeden Verlag dessen Name und eine Liste von Buchtiteln aus,
die im Jahr 2003 erschienen sind. Verlage ohne Publikationen in diesem Jahr
sollen auch ausgegeben werden.
(g) Geben Sie Nachname und Vorname aller Autoren an, die bei allen Verlagen
mindestens ein Buch geschrieben haben.
Lösungsvorschlag
(a) SELECT Name FROM Verlag;
(b) SELECT DISTINCT Titel FROM Buch WHERE Jahr = 2003;
(c) SELECT
FROM
WHERE
AND
b Titel
Review r, Buch b
r.ISBN = b.ISBN
r.Rating > 3;
1
(d) SELECT
FROM
WHERE
AND
AND
DISINCT a.Nachname, a.Vorname
Buch b, hatGeschrieben h, Autor a
b.ISBN = h.ISBN
h.AutorNr = a.AutorNr
b.Titel = "Es";
(e) SELECT DISTINCT a.Nachname, a.Vorname
FROM
hatGeschrieben h, Autor a
WHERE h.AutorNr = a.AutorNr;
(f) SELECT v.Name, b.Titel
FROM
Verlag v LEFT OUTER JOIN Buch b ON v.Name = b.verlegtBei
WHERE b.Jahr = 2003;
(g)
• Allquantor in Existenzquantor umwandeln:
SELECT a.Nachname, a.Vorname
FROM
Autor a
WHERE NOT EXISTS
(SELECT *
FROM Verlag v
WHERE NOT EXISTS
(SELECT *
FROM Buch b, hatGeschrieben h
WHERE a.AutorNr = h.AutorNr
AND b.ISBN = h.ISBN
AND b.verlegtBei = v.Name));
• GROUP BY und COUNT bei referentieller Integrität:
SELECT a.Nachname, a.Vorname
FROM
Autor a, Buch b, hatGeschrieben h
WHERE a.AutorNr = h.AutorNr
AND b.ISBN = h.ISBN
GROUP BY a.Nachname, a.Vorname
HAVING COUNT(b.verlegtBei) = (SELECT COUNT(v.Name)
FROM Verlag v);
• Mengenoperationen: ziehe vom Kreuzprodukt aus Autoren und Verlagen
die Kobinationen ab, die tatsächlich auftreten.
2. SQL-Anfragen: Terra2-DB (elektronische Abgabe, je 2 Punkte)
Formulieren Sie die folgenden Anfragen in SQL.
(a) Geben Sie eine Liste aller Berge im ’Pamir’-Gebirge aus.
2
(b) Geben Sie den Namen aller Landesteile von China zusammen mit dem Namen
der Hauptstadt des Landesteils aus. Sortieren Sie die Namen der Landesteile
aufsteigend.
(c) Geben Sie die Namen und die Höhe aller Berge in Japan aus. Sortieren Sie die
Ausgabe absteigend nach der Höhe der Berge.
(d) Finden Sie alle Länder, in denen die Hauptstadt mindestens 5-mal weniger Einwohner hat als eine andere Stadt im selben Land. Geben Sie den Landesnamen,
den Namen der Hauptstadt und alle Städte an, die mindestens 5-mal mehr Einwohner haben als die Hauptstadt. Sortieren Sie die Ausgabe aufsteigend nach
Land, Hauptstadt und Stadtname.
Lösungsvorschlag
(a) SELECT Name
FROM
Berg
WHERE Gebirge = ’Pamir’;
(b) SELECT
FROM
WHERE
AND
AND
ORDER BY
(c) SELECT
FROM
WHERE
AND
AND
AND
ORDER
(d) SELECT
FROM
WHERE
AND
AND
AND
AND
ORDER
lt.name, s.name
landesteil lt, land l, stadt s
lt.l_id = l.l_id
lt.hauptstadt = s.s_id
l.name like ’\%China\%’
lt.name;
b.name, b.hoehe
berg b, geo_Berg gb, landesteil lt,
land l
b.b_id = gb.b_id
gb.lt_id = lt.lt_id
lt.l_id = l.l_id
l.name = ’Japan’
BY b.hoehe DESC;
l.name as Land,
s1.Name as Hauptstadt,
s2.Name as Groesser
land l, landesteil lt, Stadt s1,
gehoert_lt glt, Stadt s2
l.hauptstadt = s1.s_id
l.l_id = lt.l_id
glt.lt_id = lt.lt_id
s2.s_id = glt.s_id
s2.Einwohner > 5 * s1.Einwohner
BY l.name, s1.name, s2.name;
3
3. SQL-Anfragen: Terra2-DB (elektronische Abgabe, je 3 Punkte)
Formulieren Sie die folgenden Anfragen in SQL.
(a) Geben Sie den Namen und die Höhe des höchsten Berges von Japan an.
(b) Geben Sie für jedes Gebirge den Namen und die Höhe des höchsten Berges an.
Sortieren Sie die Gebirgsnamen alphabetisch (aufsteigend).
(c) Berechnen Sie für jede Staatsform das durchschnittliche Bruttosozialprodukt
(BSP) und sortieren Sie Staatsformen absteigend nach dem durchschnittlichen
BSP. Geben Sie nur die Staatsformen aus, deren durchschnittliches BSP über
dem durchschnittlichen BSP aller Länder liegt.
Lösungsvorschlag
(a) WITH berg_japan AS
(SELECT b.b_id
FROM
berg b, geo_Berg gb, landesteil lt, land l
WHERE b.b_id = gb.b_id
AND
lt.lt_id = gb.lt_id
AND
lt.l_id = l.l_id
AND
l.Name = ’Japan’)
SELECT
FROM
WHERE
AND
b.name, b.hoehe
berg b, berg_japan bj
b.b_id = bj.b_id
b.hoehe = (SELECT MAX(b2.hoehe)
FROM
berg b2, berg_japan bj2
WHERE bj2.b_id = b2.b_id);
(b) SELECT
FROM
b1.gebirge, b1.name, b1.hoehe
berg b1,
(SELECT
b2.gebirge, MAX(b2.hoehe) as hoechsterberg
FROM
berg b2
GROUP BY b2.gebirge) b3
WHERE
b1.gebirge = b3.gebirge
AND
b1.hoehe = b3.hoechsterberg
ORDER BY b1.gebirge;
(c) SELECT
FROM
GROUP BY
HAVING
ORDER BY
staatsform, avg(BSP) as AVG_BSP
land
staatsform
AVG(BSP) > (SELECT AVG(BSP) FROM land)
AVG_BSP desc;
4
Herunterladen