Rückblick
Dieses Kapitel gehört zum Leistungskurs.
In diesem Kapitel hast du die Seite gewechselt: vom Abfragen zum Bauen. Damit kommt eine Verantwortung dazu, die es beim Abfragen nicht gab – eine falsche Abfrage liefert ein falsches Ergebnis, ein falsches DELETE vernichtet Daten.
Das kann ich jetzt
- Ich kann Tabellen mit
CREATE TABLEanlegen und passende Datentypen wählen. (7.1) - Ich kann ein Relationenschema vollständig in SQL umsetzen, samt Fremdschlüsseln. (7.1)
- Ich kann die vier Arten von Integritätsbedingungen benennen und einsetzen. (7.2)
- Ich kann vorhersagen, welche Anweisung an welcher Bedingung scheitert. (7.2)
- Ich kann Daten mit
INSERT,UPDATEundDELETEverändern – und weiß, warum ein fehlendesWHEREgefährlich ist. (7.3) - Ich kann eine Sicht anlegen und begründen, wozu sie gut ist. (7.4)
Gemischte Aufgaben
Aufgabe 1: Ein Schema umsetzen
Setze dieses Schema für einen Fahrradverleih vollständig in SQL um.
station(station_id, name, adresse, plaetze)
radtyp(radtyp_id, bezeichnung)
rad(rad_id, baujahr, radtyp_id → radtyp, station_id → station)
kundin(kundin_id, vorname, nachname, email, geburtsjahr)
fahrt(fahrt_id, rad_id → rad, kundin_id → kundin, start, ende, kilometer)
Zusätzlich gilt:
- Der Name einer Station, die Bezeichnung eines Radtyps und die E-Mail-Adresse einer Kundin dürfen nicht fehlen.
- Eine E-Mail-Adresse und eine Typbezeichnung kommen jeweils nur einmal vor.
- Ein Rad hat immer einen Typ, steht aber nicht immer an einer Station.
- Eine Fahrt hat immer ein Rad und eine Kundin.
Achte auf die Reihenfolge der Anweisungen.
Begründe außerdem: Warum steht der Radtyp in einer eigenen Tabelle, statt einfach als Text in rad?
Tipp 1: Welche Tabelle zuerst?
Ein Fremdschlüssel kann nur auf eine Tabelle verweisen, die es schon gibt. Sortiere also so, dass jede Tabelle nach allen Tabellen kommt, auf die sie verweist. Hier heißt das: erst station und kundin, dann rad, zuletzt fahrt.
Tipp 2: Welche Bedingung wofür?
| Verlangt | Bedingung |
|---|---|
| darf nicht fehlen | NOT NULL hinter dem Datentyp |
| kommt nur einmal vor | UNIQUE (spalte) als eigene Zeile am Ende der Tabellendefinition |
| verweist auf eine andere Tabelle | REFERENCES tabelle(spalte) |
| Wert aus einer festen Liste | keine Bedingung, sondern eine eigene Tabelle mit Fremdschlüssel darauf |
Aufgabe 2: Was scheitert woran?
Angenommen, das Schema aus Aufgabe 1 ist angelegt. Es gibt die Station 1, den Radtyp 1 und die Kundin 1 mit der Adresse mail@beispiel.de. Auf Station 1 steht bereits ein Rad.
Sag für jede Anweisung voraus: Läuft sie durch, oder scheitert sie? Wenn sie scheitert – welche Bedingung greift, und wann fällt es auf: schon beim Lesen der Anweisung oder erst beim Ausführen?
-- a)
INSERT INTO kundin (kundin_id, vorname, email) VALUES (2, 'Ben', 'mail@beispiel.de');
-- b)
INSERT INTO station (station_id, name, plaetze) VALUES (2, NULL, 20);
-- c)
INSERT INTO rad (rad_id, baujahr, radtyp_id, station_id) VALUES (7, 2024, 99, 1);
-- d)
INSERT INTO rad (rad_id, baujahr, radtyp_id) VALUES (8, 2023, 1);
-- e)
INSERT INTO station (station_id, name, plaetze) VALUES (1, 'Zweite', 15);
-- f)
DELETE FROM station WHERE station_id = 1;
Aufgabe 3: Ändern mit Bedacht
Im Übungsbereich liegt eine Kopie der Festivaldatenbank, in der du gefahrlos arbeiten kannst.
a) Trage eine neue Bühne ein: Waldlichtung, 350 Plätze, nicht überdacht.
b) Erhöhe die Kapazität der Zeltbühne um 200.
c) Lösche alle Bewertungen mit weniger als 2 Punkten. Sag vorher mit einer Abfrage, wie viele es sein werden, und prüfe danach nach.
d) Formuliere die Anweisung aus b) einmal ohne WHERE. Was würde sie anrichten? Führe sie nicht aus.
e) Lege eine Sicht grosse_buehnen an, die Name und Kapazität aller Bühnen mit mehr als 1000 Plätzen enthält. Frage sie danach ab.
Tipp zu c)
Schreib die Abfrage zuerst als SELECT COUNT(*) mit genau derselben Bedingung. Wenn die Zahl plausibel ist, ersetzt du SELECT COUNT(*) durch DELETE. Das ist die übliche Vorsichtsmaßnahme vor jedem DELETE.