Zum Hauptinhalt springen

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

DatentypBeschreibungBeispielwerte
INTEGERGanze Zahl1, -42, 2026
REALFließkommazahl3.14, -0.5, 7.0
TEXTZeichenkette (in einfachen Anführungszeichen)'Inception', 'Nolan'
NUMERICZahl, intern auch für Datum/Zeit als 'YYYY-MM-DD'2010, '2010-07-16'
BLOBBinä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:

ConstraintBedeutung
PRIMARY KEYEindeutige Identifikation einer Zeile (nicht NULL, einmalig).
NOT NULLDer Wert darf nicht leer sein.
UNIQUEJeder Wert in der Spalte darf nur einmal vorkommen.
DEFAULT wertWird kein Wert angegeben, wird wert eingesetzt.
CHECK (...)Eine eigene Bedingung, die der Wert erfüllen muss.
FOREIGN KEYVerweist 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:

  1. kuenstler mit kuenstler_id (Primärschlüssel), name (Pflicht), gruendungsjahr und herkunftsland.
  2. album mit album_id (Primärschlüssel), titel (Pflicht), jahr (≥ 1900), genre (Standardwert 'Pop') und einem Fremdschlüssel kuenstler_id, der auf kuenstler verweist.
  3. song mit song_id (Primärschlüssel), titel (Pflicht), dauer_sek (> 0), gespielt_tausend (≥ 0) und einem Fremdschlüssel album_id, der auf album verweist.

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)
  1. Füge mindestens drei Künstler und für jeden Künstler mindestens ein Songs ein.
  2. Erhöhe das Erscheinungsjahr eines Songs um 1 (z. B. weil ein Fehler aufgefallen ist).
  3. Ändere bei allen Songs eines bestimmten Künstlers das genre auf 'Rock'.
  4. Lösche alle Songs mit unter 500 Tausend Wiedergaben (gespielt_tausend < 500).
  5. 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 dem BEGIN.

Mehr zu Transaktionen findet sich auch auf der SQLite Seite

Übersicht — DDL & DML

ZweckBefehl
Tabelle anlegenCREATE TABLE t (...);
Tabelle löschenDROP TABLE t; bzw. DROP TABLE IF EXISTS t;
Spalte hinzufügenALTER TABLE t ADD COLUMN spalte TYP;
Spalte/Tabelle umbenennenALTER TABLE t RENAME [COLUMN alt] TO neu;
Zeilen einfügenINSERT INTO t (s1, s2) VALUES (...), (...);
Zeilen ändernUPDATE t SET s1 = ... WHERE ...;
Zeilen löschenDELETE FROM t WHERE ...;
TransaktionBEGIN 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:

  1. Miniwelt beschreiben: Welche Objekte gibt es? Welche Eigenschaften? Welche Beziehungen?
  2. Schema festlegen: Welche Tabellen, welche Spalten, welche Datentypen? Wo gehört NOT NULL, UNIQUE, CHECK oder ein DEFAULT hin? Welche Tabelle bekommt einen FOREIGN KEY?
  3. CREATE TABLE der Tabellen — in sinnvoller Reihenfolge (referenzierte Tabellen zuerst).
  4. INSERT INTO mindestens 5 sinnvolle Datensätze pro Tabelle.
  5. UPDATE/DELETE mindestens je einen sinnvollen Änderungs- und Löschbefehl.
  6. SELECT mit JOIN — eine Abfrage, die beide Tabellen verbindet und etwas Interessantes zeigt.