Repetition Datenbanken 1. Für eine Musikschule soll ein ER-Diagramm erstellt werden. Folgendes soll berücksichtigt werden: Jede Lektion (findet wöchentlich statt) wird von genau einem Lehrer gehalten, es können aber mehrere Schüler an der Lektion teilnehmen. Nicht alle Schüler einer Lektion müssen das gleiche Instrument spielen. Es soll aber festgehalten werden, welcher Schüler mit welchem Instrument an einer bestimmten Lektion teilnimmt. Ein Schüler kann mehrere Instrumente spielen. Sowohl für Schüler als auch Lehrer soll der Name und die Adresse gespeichert werden (Attribut Name und Adresse). 2. Transformiere das folgende ER-Diagramm in Relationenschemas. Kunde(KundenNr, Vorname, Nachname, Ort) Auftrag(AuftragNr, Datum, KundenNr) enthält(AuftragNr, ISBN, Anzahl) Buch(ISBN, Autor, Titel, Name, Ort) Verlag(Name, Ort, Beschreibung) 1 1 1 1 1 3. Anomalien und funktionale Abhängigkeit Eine Firma bietet Beratungen in verschiedenen Bereichen an. Im Folgenden die Tabelle Beratung mit einem Auszug der getätigten Beratungen: KundenNr 1 1 1 1 2 2 3 3 4 4 Kundenname BeraterID BeraterName Emil Schmidt 1 Helena Meier Emil Schmidt 2 Ingo Fuchs Emil Schmidt 3 John Müller Emil Schmidt 4 Elisabeth Schulz Hans Müller 2 Ingo Fuchs Hans Müller 3 John Müller Johanna Schulze 1 Helena Meier Johanna Schulze 3 John Müller Markus Schulte 1 Helena Meier Markus Schulte 2 Ingo Fuchs Aufgabe Stundenlohn AnzStunden Total IT-Berater 80€ 3 240€ Finanzberater 70€ 5 350€ IT-Berater 80€ 7 560€ Finanzberater 70€ 8 560€ Finanzberater 70€ 4 280€ IT-Berater 80€ 3 240€ IT-Berater 80€ 4 320€ IT-Berater 80€ 2 160€ IT-Berater 80€ 5 400€ Finanzberater 70€ 2 140€ Aufgaben Überlege dir zur obigen Tabelle folgendes: a) Welche Informationen sind redundant (also mehrfach abgespeichert)? b) Finde zu den folgenden Anomalien je ein konkretes Beispiel: Update-Anomalie Lösch-Anomalie Einfüge-Anomalie a) Ist das Attribut BeraterID funktional abhängig von Kundenname? b) Ist das Attribut Total funktional abhängig von der Attributmenge (Stundenlohn, AnzStunden)? c) Ist das Attribut Kundenname funktional abhängig von KundenNr? Und umgekehrt? Normalisierung Die folgende Tabelle mit Bestelldaten ist in der 1NF. Transformiere sie schrittweise in die 2. und 3. Normalform. Zeichne die entsprechenden Relationenschemas mit allen Abhängigkeiten auf (verwende die Abkürzungen teilweise, vollständig, transitiv). Den Inhalt der Tabelle musst du nicht aufschreiben, nur die Namen der Attribute. KNr Nachname Ort 181 Meier Genf ArtikelNr ArtikelBezeichnung Preis 25 Papier A4 5.50 Anzahl Total 2 11.- Lösung Abhängigkeitsdiagramm 2NF KNr Name Ort Artikel-Nummer Artikel-Bezeichnung KNr ArtikelNr Anz Preis Total Das Total ist vollständig abhängig vom Schlüssel, gleichzeitig aber auch funktional abhängig von ArtikelNr und Anz (also transitiv abhängig, weil eine Abhängigkeit von einem nicht-Schlüsselattribut besteht). 3NF KNr Name Straße Nr Ort Artikel-Nummer Artikel-Bezeichnung KNr ArtikelNr Datum Preis Anz Die transitive Abhängigkeit wird dadurch aufgelöst, dass das Total einfach ganz weggelassen wird. Das ist zulässig, weil die Information redundant ist (sie kann aus anderen Feldern der DB hergeleitet werden). SQL Gehe für die folgenden SQL-Aufgaben von diesen Tabellen aus: Schreibe SQL-Abfragen, die folgendes liefern (dazu dürfen keine Daten "von Hand" aus den Tabellen herausgelesen werden). (1) [2] Vorname und Nachname aller Kunden, nach Nachnamen alphabetisch absteigend geordnet (z, y, x, ...). SELECT Name FROM Kunde ORDER BY Name DESC (2) [1] Den Durchschnittspreis aller Waren, die angeboten werden. SELECT AVG(Preis) FROM Waren (3) [2] Wie viele Artikel werden in der Warengruppe "Kolonialwaren" angeboten? SELECT COUNT(*) FROM Waren WHERE Warengruppe = "Kolonialwaren"; (4) [2] Welche Kunden (Nachnamen) haben am 8.1.2009 eingekauft (Format des Datums: '08.01.2009')? Jeder Nachname soll nur einmal in der Resultat-Tabelle erscheinen. SELECT DISTINCT Name FROM Kunde NATURAL JOIN Kauf WHERE Datum = '08.01.2009'; (5) [2] Eine Tabelle, die zeigt welche Waren (Bezeichnung) die Kunden Pauli, Jauch und Leu gekauft haben. SELECT Bezeichnung, Name FROM Kunde NATURAL JOIN Kauf NATURAL JOIN Ware WHERE Name IN ('Pauli', 'Jauch', 'Leu'); (6) [2.5] Für jedes Datum den Umsatz (das Total aller Einkäufe dieses Tages). SELECT Datum, sum(Preis*Menge) FROM Ware NATURAL JOIN Kauf GROUP BY Datum (7) [2.5] Für jedes Datum die Anzahl Artikel, die Herr Vonlanten gekauft hat, aber nur die Tage, an denen er mehr als einen Artikel eingekauft hat. SELECT Datum, sum(Menge) FROM Kunde NATURAL JOIN Kauf WHERE Name = "Vonlanten" GROUP BY Datum HAVING sum(Menge) > 1 (10) [3] Welche Personen haben gar nichts eingekauft (Tipp: LEFT JOIN) SELECT Name FROM Kunde LEFT JOIN Kauf ON Kunde.KundenNr = Kauf.KundenNr WHERE WarenNr IS NULL; (11) Welche Tabelle liefert die folgende SQL-Abfrage? a) [2] SELECT Name, Vorname FROM Kunde WHERE KundenNr IN (SELECT KundenNr FROM Kauf WHERE WarenNr < 400); Name Vorname Emmengger Roland Vonlanten Peter (12) [4.5] Welche Personen (Nachnamen) haben insgesamt eine grössere Anzahl Artikel gekauft als Herr Vonlanten? SELECT Name FROM Kunde NATURAL JOIN Kauf GROUP BY Name HAVING sum(Menge) > ( SELECT sum(Menge) FROM Kunde NATURAL JOIN Kauf WHERE Name = 'Vonlanten');