Hinweise: Datenbanksysteme I Aufgabenblatt 4: SQL Abgabetermin: Montag, 08.01.07, 13:30 (vor der Vorlesung) Format: Auf Papier im Fach Datenbanksysteme I im Foyer oder per E-Mail an dbs1@hpi.uni-potsdam.de und Brigitte.Hobro@hpi.uni-potsdam.de im CC (PDF oder DOC) Bearbeitung: Allein oder in Zweiergruppen Bitte verwenden Sie für jede Aufgabe ein separates Blatt, welches Sie mit Ihren Namen und Matrikelnummern beschriften! Hinweis zum Starten des DBMS auf den Poolraumrechnern Wegen fehlender Adminrechte müssen die IBM DB2-Services über ein von den Admins geschriebenes Programm gestartet werden. Sie nden es unter: Start/Programs/IBM DB2/DB2COPY1 (default)/ General Administration Tools/db2_services_ctrl.exe Wenn Sie Services starten angeklickt und mit OK bestätigt haben, minimiert sich das Programm in die Taskleiste sobald DB2 gestartet ist. Aufgabe 1: Datenbank einrichten [ohne Bewertung] Im Verzeichnis R:/DBSI_naumann/ nden Sie 5 Dateien, die Daten für eine Datenbank enthalten. Erzeugen Sie im Poolraum oder zu Hause eine neue DB2 Datenbank mit dem Namen DB < matrikelnummer >. Denieren Sie die Relationenschemata und laden Sie die Daten in die Datenbank. Der Name der Relationen sollte den Namen der Dateien entsprechen. Die Attributnamen sind jeweils in der ersten Zeile vermerkt. Wählen Sie geeignete Datentypen selbst aus. Sie benötigen die Datenbank zur Lösung der folgenden Aufgaben. Wichtig: Löschen Sie die DB sobald sie den Arbeitsplatz verlassen (DROP DATABASE datenbankname). Ein entsprechendes Skript vermeidet doppelte Arbeit. Aufgabe 2: Text SQL [3+2+4+3+3+4+4+5 = 28 Punkte] Nennen Sie für jede der folgenden natürlichsprachlichen Fragen eine geeignete SQL-Anfrage. Begründen Sie, falls das nicht möglich ist. Führen Sie die Anfrage auf den Daten aus Aufgabe 1 aus und beantworten Sie die jeweils in der Teilaufgabe gestellte Frage. Hinweise: Benennen Sie aggregierte Spalten so um, dass sinnvolle Spaltennamen ausgegeben werden. 1
Einige der Tabellen enthalten eine Spalte mit dem Namen ID. Hierbei handelt es sich jedoch um Zeilennummern und nicht um Werte, die etwa einen Film oder eine Person eindeutig identizieren müssen. Treen Sie soweit nötig geeignete Annahmen bezüglich des DB-Schemas. a) Geben Sie alle Genres aus, die keine zugehörigen Einträge in der Filmtabelle haben (nach Genrenamen sortiert)! Jedes Genre soll dabei nur einmal ausgegeben werden. b) Wieviele Schauspielerinnen gibt es? c) Wieviele Schauspieler gibt es, die in mindestens einem Film mitgemacht haben, der einen entsprechenden Eintrag in der Filmtabelle hat? Formulieren Sie die Anfrage einmal mit und einmal ohne einer Subanfrage. d) Geben Sie die Titel aller Filmpaare aus, in denen mindestens ein gemeinsamer Schauspieler mitspielt! Sortieren Sie das Ergebnis nach dem Titel des zweiten Films. e) Geben Sie alle Filme (Titel, Jahr) aus, deren Titel mit Tatort beginnen, und zusätzlich wie viele Schauspielerinnen an diesen Folgen jeweils beteiligt sind. f) Geben Sie die Schauspieler und Produzenten an, die am Film Adventures of Lano & Woodley, The beteiligt waren, und zwar einmal nach Mengen- und ein weiteres Mal nach Multimengensemantik. (Hinweis: UNION benutzen) g) Erstellen Sie eine Top-3 Liste der Schauspieler und Schauspielerinnen (Name) mit den meisten Filmen! Sortieren Sie entsprechend. Hinweis: Recherchieren Sie hierzu die FETCH FIRST Klausel, z.b. bei http://www.ibm.com/software/data/db2/udb/ support/manualsv9.html, SQL Reference. h) Nennen Sie für das höchste vorkommende Jahr die Jahreszahl und die entsprechende Anzahl der Filme, die in diesen Jahren veröentlicht wurden. Die gleichen Informationen sollen in derselben Anfrage auch für das Jahr mit den meisten Filmen ausgegeben werden. 2
Aufgabe 3: SQL Text [2+3+6 = 11 Punkte] Geben Sie natürlichsprachlich wieder, wonach die folgenden SQL-Queries suchen. a) und b) verwenden folgendes Schema, das zum Speichern von Vertriebsdaten dient. kunden (kundennr, vorname, familienname, alter) produkte (id, name, preis) regionen (id, name) verkaeufe (id, kundennr, produkt_id, region_id, anzahl, datum) a) SELECT p.id, p.name, max(v.anzahl) FROM produkte AS p INNER JOIN verkaeufe AS v ON p.id = v.produkt_id GROUP BY p.id, p.name ORDER BY p.name b) SELECT r.name, k.alter, COUNT(*) INNER JOIN produkte AS p ON v.produkt_id = p.id WHERE (r.name = 'Asien' OR r.name = 'Europa') AND p.name LIKE 'Nintendo Wii Controller' GROUP BY r.id, r.name, k.alter ORDER BY r.name ASC, k.alter ASC 3
c) Hinweis: Der Operator TABLESAMPLE BERNOULLI (prozent) ist IBM UDB-spezisch und gibt zufällig ausgewählte Tupel der Ergebnismenge zurück. SELECT * FROM imdb.actor AS a WHERE a.movie_id IN ( SELECT DISTINCT m.mid FROM imdb.movie AS m TABLESAMPLE BERNOULLI (0.10) INNER JOIN imdb.language AS l ON l.movie_id = m.mid INNER JOIN imdb.genres AS g ON g.movie_id = m.mid WHERE l.language LIKE '%German%' AND g.genre NOT LIKE '%Adult%' UNION SELECT a.movie_id AS mid FROM imdb.actor AS a TABLESAMPLE BERNOULLI (0.01) INNER JOIN imdb.producers AS p ON p.name = a.name WHERE a.movie_id = p.movie_id ) UNION SELECT * FROM imdb.actor AS a TABLESAMPLE BERNOULLI(0.0002) Werden Tupel doppelt ausgegeben? Begründen Sie! 4
Aufgabe 4: Relationale Algebra SQL [2+3+4 = 9 Punkte] Formulieren Sie die folgenden drei Anfragen der relationalen Algebra als SQL-Anfragen! Verwendetes Schema: Stadt (StadtName, LandID, p1950, p2000, p2015) Land (LandID, Name, Kontinent, Hauptstadt, Bevoelkerung) Geographie (LandID, Landäche, Wasseräche, Küstenlänge, urbar) a) π Name,Kontinent (σ Bevoelkerung>200.000.000 (Land)) b) π Name (σ (Bevoelkerung<2 p1950) (Bevoelkerung<4 p2000) (σ StadtName=Hauptstadt (Stadt Land))) c) π Name (Land Geographie) π Name (Land (σ G1.urbar<G2.urbar (ρ G1 (Geographie) π urbar (ρ G2 (Geographie))))) Aufgabe 5: Sichten [3+3 = 6 Punkte] Schreiben Sie die Anfrage b) aus Aufgabe 3 unter Verwendung der jeweiligen Sicht um. Falls das nicht möglich sein sollte bzw. nicht sinnvoll ist, begründen Sie dies! a) CREATE VIEW Asienverkaeufe AS SELECT r.name, k.alter AS alter, v.produkt_id AS produkt_id, COUNT(*) AS anzahlverkaeufe WHERE r.name = 'Asien' GROUP BY r.id, r.name v.produkt_id ORDER BY r.name ASC, k.alter ASC b) CREATE VIEW WiiVerkaeufe AS SELECT k.alter AS alter, v.region_id AS region_id, p.name AS produktname, COUNT(*) AS anzahlverkaeufe INNER JOIN produkte AS p ON v.produkt_id = p.id WHERE p.name LIKE 'Nintendo Wii%' GROUP BY v.region_id, k.alter, p.id, p.name ORDER BY k.alter ASC 5