Dies ist eine alte Version des Dokuments!
LU07b – SQL-DML: Daten einfügen, ändern, löschen
In LU05 haben wir die DDL (Data Definition Language) kennengelernt, mit der Tabellen angelegt werden. Jetzt wenden wir uns der DML (Data Manipulation Language) zu – damit fügen wir Daten ein, ändern sie oder löschen sie wieder.
Folgender SQL-Code erzeugt eine leere Tabelle favourite_film mit den Spalten ISAN1), title2), director3), released_year4), star15):
CREATE TABLE favourite_film ( ISAN CHAR(33) PRIMARY KEY, title VARCHAR(100), director VARCHAR(50), released_year YEAR, star1 VARCHAR(50) );
Wichtig: ISAN ist der Primärschlüssel → jeder Datensatz darf nur einmal vorkommen. released_year ist ein Jahresfeld (vierstellig).
DML = Data Manipulation Language: INSERT, UPDATE, DELETE. (Read erfolgt mit SELECT und gehört streng genommen zur DQL, wird im Alltag bei CRUD aber oft mitgemeint.)
Lernziele
- Ich kann Daten einfügen (INSERT), ändern (UPDATE) und löschen (DELETE) – und mit WHERE korrekt einschränken.
- Ich erkenne typische Fehlerquellen (fehlendes WHERE, falsche Datentypen, Schlüsselverletzungen).
INSERT – Daten einfügen
Variante A: Spalten explizit angeben
INSERT INTO favourite_film (ISAN, title, director, released_year, star1) VALUES ('0000-0000-2A1B-0000-0-0000-0000-X', 'Lost in Translation', 'Sofia Coppola', 2003, 'Scarlett Johansson');
Variante B: Mehrere Zeilen auf einmal
INSERT INTO favourite_film (ISAN, title, director, released_year, star1) VALUES ('0000-0000-3C2D-0000-0-0000-0000-X', 'Inception', 'Christopher Nolan', 2010, 'Leonardo DiCaprio'), ('0000-0000-4E3F-0000-0-0000-0000-X', 'Arrival', 'Denis Villeneuve', 2016, 'Amy Adams');
Variante C: INSERT … SELECT (Daten aus einer anderen Tabelle übernehmen) Mit INSERT ... SELECT können Datensätze direkt aus einer bestehenden Tabelle in eine andere kopiert werden. Das ist besonders nützlich, wenn z. B. eine Entwurfstabelle bereits Test- oder Importdaten enthält und wir diese (ganz oder teilweise) in die produktive Tabelle übernehmen möchten.
Voraussetzung: Es existiert eine temporäre Tabelle favourite_film_draft mit denselben Spaltennamen wie favourite_film.
INSERT INTO favourite_film (ISAN, title, director, released_year, star1) SELECT ISAN, title, director, released_year, star1 FROM favourite_film_draft WHERE released_year >= 2000;
Hinweis: Mit der WHERE-Bedingung können gezielt nur bestimmte Datensätze übernommen werden (z. B. nur Filme ab dem Jahr 2000).
Tipps:
Zahlen/Jahr ohne Anführungszeichen, Texte in Anführungszeichen: 'Inception'.
Fehlermeldung „duplicate key“? → Der ISAN existiert bereits (Primärschlüssel).
UPDATE – Daten ändern
Sind bereits Daten in der Tabelle vorhanden, können wir sie mit dem UPDATE-Befehl aktualisieren.
Wichtig: Immer mit WHERE einschränken! Das Statement würde auch ohne WHERE-Clause funktionieren, aber dann würden alle Datensätze in der ganzen Tabelle überschrieben.
-- Regie-Credit korrigieren (gezielt über Primärschlüssel) UPDATE favourite_film SET director = 'C. Nolan' WHERE ISAN = '0000-0000-3C2D-0000-0-0000-0000-X';
Mehrere Spalten in einem Datensatz auf einmal ändern
UPDATE favourite_film SET title = 'Arrival (Extended Cut)', star1 = 'Amy Adams' WHERE ISAN = '0000-0000-4E3F-0000-0-0000-0000-X';
Semantische Updates (vorsichtig!)
-- Alle Filme mit leerem Hauptdarsteller:in mit einem Standardwert füllen (Beispiel) UPDATE favourite_film SET star1 = 'TBD' WHERE star1 IS NULL;
Warnung: Ohne WHERE werden alle Zeilen geändert. Prüfen Sie Updates immer zuerst mit einem entsprechenden SELECT (Dry-Run).
DELETE – Daten löschen
Mit dem DELETE-Befehl können Datensätze (= Zeilen) aus der Tabelle gelöscht werden.
Gezielt löschen (über Primärschlüssel)
DELETE FROM favourite_film WHERE ISAN = '0000-0000-2A1B-0000-0-0000-0000-X';
Mehrere Datensätze in einem Schritt (IN-Liste)
DELETE FROM favourite_film WHERE ISAN IN ( '0000-0000-3C2D-0000-0-0000-0000-X', '0000-0000-4E3F-0000-0-0000-0000-X' );
Aufräumen nach Import (z. B. fehlerhafte Jahrgänge)
DELETE FROM favourite_film WHERE released_year < 1900 OR released_year IS NULL;
Warnung: DELETE ohne WHERE leert die gesamte Tabelle.
TRUNCATE – Tabelle schnell leeren (ohne WHERE)
TRUNCATE entfernt alle Zeilen einer Tabelle sehr schnell. Im Unterschied zu DELETE: * Keine WHERE-Bedingung möglich (immer die ganze Tabelle). * Setzt häufig Zähler (z. B. AUTO_INCREMENT) zurück. * Kann durch Fremdschlüssel-Constraints blockiert sein. * Gilt in vielen Systemen als DDL-Operation (ähnlich wie Tabellendefinitionen).
TRUNCATE TABLE favourite_film;
Merke: Nutzen Sie TRUNCATE nur, wenn Sie die Tabelle vollständig leeren wollen. Für selektives Löschen bleibt DELETE die richtige Wahl.
NULL richtig verstehen
NULL bedeutet: kein Wert vorhanden (weder 0 noch leerer String). Abfragen mit IS NULL bzw. IS NOT NULL:
-- Filme ohne eingetragenen Star SELECT ISAN, title FROM favourite_film WHERE star1 IS NULL; -- Filme mit eingetragenem Star SELECT ISAN, title, star1 FROM favourite_film WHERE star1 IS NOT NULL;
Merke: Vergleiche mit = oder <> funktionieren bei NULL nicht. Immer IS NULL / IS NOT NULL verwenden.
Praxis: Sicher arbeiten (SELECT-Variante & Dry-Run)
Vor jedem UPDATE bzw. DELETE zuerst mit SELECT testen, ob die gleiche WHERE-Bedingung die gewünschten Zeilen trifft:
-- Dry-Run: Welche Zeilen wären betroffen? SELECT ISAN, title FROM favourite_film WHERE released_year >= 2020;
Wenn korrekt: erst dann UPDATE/DELETE mit derselben WHERE-Bedingung ausführen.