SQL - Daten und Struktur (DDL & DML)
Bisher wurden Datenbanken nur abgefragt (Grundlagen, Gruppierung & Subqueries, JOINs & Mengen). Damit eine Datenbank überhaupt existiert, müssen jedoch zuerst Tabellen angelegt und mit Daten gefüllt werden. Beides geschieht ebenfalls mit SQL — in zwei eigenen Teilsprachen:
- DDL — Data Definition Language: Definiert die Struktur der Datenbank. Befehle:
CREATE,ALTER,DROP. - DML — Data Manipulation Language: Verändert die Daten in den Tabellen. Befehle:
INSERT,UPDATE,DELETE.
Miniwelt: Filmsammlung
Als Beispiel bauen wir die Datenbank einer kleinen Filmsammlung Schritt für Schritt selbst auf. Die Datenbank soll zwei Tabellen enthalten:
- regisseur (regisseur_id, name, geburtsjahr, nationalitaet)
- film (film_id, titel, jahr, genre, dauer_min, bewertung, 🠙regisseur_id)
DDL — Struktur anlegen
CREATE TABLE — Eine Tabelle anlegen ●○
Mit CREATE TABLE wird eine neue Tabelle erzeugt. In Klammern wird angegeben, welche Spalten (Attribute) die Tabelle haben soll und welchen Datentyp jede Spalte erhält.
Hinweis zur Konsole: Wird ein CREATE TABLE-Befehl zweimal ausgeführt, meldet die Datenbank, dass die Tabelle bereits existiert. Mit DROP TABLE (s.u.) kann sie vorher gelöscht werden, oder man verwendet CREATE TABLE IF NOT EXISTS ....
Die wichtigsten Datentypen in SQLite
| Datentyp | Beschreibung | Beispielwerte |
|---|---|---|
INTEGER | Ganze Zahl | 1, -42, 2026 |
REAL | Fließkommazahl | 3.14, -0.5, 7.0 |
TEXT | Zeichenkette (in einfachen Anführungszeichen) | 'Inception', 'Nolan' |
NUMERIC | Zahl, intern auch für Datum/Zeit als 'YYYY-MM-DD' | 2010, '2010-07-16' |
BLOB | Binärdaten (z. B. Bilder) — selten direkt verwendet | — |
Spalten-Bedingungen (Constraints) ●○
Constraints sind Regeln an einer Spalte. Sie sichern, dass nur sinnvolle Werte in die Tabelle gelangen. Die wichtigsten:
| Constraint | Bedeutung |
|---|---|
PRIMARY KEY | Eindeutige Identifikation einer Zeile (nicht NULL, einmalig). |
NOT NULL | Der Wert darf nicht leer sein. |
UNIQUE | Jeder Wert in der Spalte darf nur einmal vorkommen. |
DEFAULT wert | Wird kein Wert angegeben, wird wert eingesetzt. |
CHECK (...) | Eine eigene Bedingung, die der Wert erfüllen muss. |
FOREIGN KEY | Verweist auf den Primärschlüssel einer anderen Tabelle (s. u.). |
Fremdschlüssel (FOREIGN KEY) ●○
Mit einem Fremdschlüssel wird eine Spalte als Verweis auf einen Primärschlüssel einer anderen Tabelle markiert. So entsteht eine Beziehung zwischen Tabellen — genau das, was JOINs später ausnutzen.
DROP TABLE — Tabellen löschen ●○
DROP TABLE löscht eine Tabelle mit allen Daten. Dieser Vorgang ist nicht rückgängig zu machen. Damit es keine Fehlermeldung beim Erstellen von Tabellen mit CREATE gibt, werden vorher oft mit DROP TABLE IF EXISTS ... bereits existierende Tabellen gelöscht.
Training — Music Streaming
Plane und erstelle ein eigenes kleines Datenbankschema zum Thema Music Streaming mit drei verknüpften Tabellen:
kuenstlermitkuenstler_id(Primärschlüssel),name(Pflicht),gruendungsjahrundherkunftsland.albummitalbum_id(Primärschlüssel),titel(Pflicht),jahr(≥ 1900),genre(Standardwert'Pop') und einem Fremdschlüsselkuenstler_id, der aufkuenstlerverweist.songmitsong_id(Primärschlüssel),titel(Pflicht),dauer_sek(> 0),gespielt_tausend(≥ 0) und einem Fremdschlüsselalbum_id, der aufalbumverweist.
Achte auf die richtige Anlegereihenfolge — eine Tabelle kann erst dann mit einem Fremdschlüssel referenziert werden, wenn die Ziel-Tabelle bereits existiert.
DML — Daten einfügen, ändern und löschen
Eine angelegte Tabelle ist zunächst leer. Mit der DML werden Daten verwaltet.
INSERT INTO — Zeilen einfügen ●○
Es gibt zwei gängige Schreibweisen:
Variante 1 — mit Spaltenliste (empfohlen): Reihenfolge der Werte muss zur angegebenen Spaltenliste passen. Fehlende Spalten werden mit NULL oder ihrem DEFAULT-Wert gefüllt.
Variante 2 — ohne Spaltenliste: Es müssen Werte für alle Spalten in der Reihenfolge der Tabellendefinition angegeben werden.
UPDATE — Bestehende Daten ändern ●○
UPDATE verändert vorhandene Zeilen. Über WHERE wird festgelegt, welche Zeilen geändert werden. Ohne WHERE werden alle Zeilen verändert — typische Quelle von Datenunfällen.
DELETE — Zeilen löschen ●○
DELETE FROM t WHERE ... löscht alle Zeilen, die die Bedingung erfüllen. Ohne WHERE werden alle Zeilen gelöscht — die Tabelle selbst bleibt aber bestehen.
Training
Übe Einfügen, Ändern und Löschen mit deiner eigenen Music-Streaming-Datenbank.
Bereits angelegtes Schema:
- kuenstler (kuenstler_id, name, gruendungsjahr, herkunftsland)
- song (song_id, titel, jahr, genre, gespielt_tausend, 🠙kuenstler_id)
- Füge mindestens drei Künstler und für jeden Künstler mindestens ein Songs ein.
- Erhöhe das Erscheinungsjahr eines Songs um 1 (z. B. weil ein Fehler aufgefallen ist).
- Ändere bei allen Songs eines bestimmten Künstlers das
genreauf'Rock'. - Lösche alle Songs mit unter 500 Tausend Wiedergaben (
gespielt_tausend < 500). - Prüfe mit einem
JOINüber beide Tabellen, ob die Einträge stimmig sind.
Transaktionen ●●
Mehrere DML-Befehle gehören oft logisch zusammen — etwa eine Überweisung: erst Geld abbuchen, dann gutschreiben. Soll entweder alles oder gar nichts passieren, fasst man die Befehle in einer Transaktion zusammen.
BEGIN TRANSACTION;— startet eine Transaktion.COMMIT;— bestätigt alle Änderungen.ROLLBACK;— verwirft alle Änderungen seit demBEGIN.
Mehr zu Transaktionen findet sich auch auf der SQLite Seite
Übersicht — DDL & DML
| Zweck | Befehl |
|---|---|
| Tabelle anlegen | CREATE TABLE t (...); |
| Tabelle löschen | DROP TABLE t; bzw. DROP TABLE IF EXISTS t; |
| Spalte hinzufügen | ALTER TABLE t ADD COLUMN spalte TYP; |
| Spalte/Tabelle umbenennen | ALTER TABLE t RENAME [COLUMN alt] TO neu; |
| Zeilen einfügen | INSERT INTO t (s1, s2) VALUES (...), (...); |
| Zeilen ändern | UPDATE t SET s1 = ... WHERE ...; |
| Zeilen löschen | DELETE FROM t WHERE ...; |
| Transaktion | BEGIN TRANSACTION; ... COMMIT; / ROLLBACK; |
Projekt — eigene Datenbank entwerfen
Training
Entwerft eine eigene kleine Datenbank zu einem Thema eurer Wahl (z. B. Sportverein, Café, Computerspiele, Klassenfahrt). Geht dabei in dieser Reihenfolge vor:
- Miniwelt beschreiben: Welche Objekte gibt es? Welche Eigenschaften? Welche Beziehungen?
- Schema festlegen: Welche Tabellen, welche Spalten, welche Datentypen? Wo gehört
NOT NULL,UNIQUE,CHECKoder einDEFAULThin? Welche Tabelle bekommt einenFOREIGN KEY? CREATE TABLEder Tabellen — in sinnvoller Reihenfolge (referenzierte Tabellen zuerst).INSERT INTOmindestens 5 sinnvolle Datensätze pro Tabelle.UPDATE/DELETEmindestens je einen sinnvollen Änderungs- und Löschbefehl.SELECTmitJOIN— eine Abfrage, die beide Tabellen verbindet und etwas Interessantes zeigt.