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.
Folgender SQL-Code erzeugt eine leere Tabelle favourite_film mit den Spalten film_id1), title2), director3), released_year4), star15):
CREATE TABLE favourite_film ( film_id INT AUTO_INCREMENT PRIMARY KEY, title VARCHAR(100), director VARCHAR(50), released_year YEAR, star1 VARCHAR(50) );
Wichtig: film_id ist der Primärschlüssel → jeder Datensatz erhält automatisch eine eindeutige ID.
DML = Data Manipulation Language: INSERT, UPDATE, DELETE. (Read erfolgt mit SELECT und gehört streng genommen zur DQL, wird im Alltag bei CRUD6) aber mitgemeint.)
Bisher haben wir neue Datensätze über die Webstorm-Oberfläche eingefügt (Edit Data > „+“):
Das funktioniert, ist aber mühsam und fehleranfällig, wenn viele Daten eingetragen werden müssen. Darum machen wir das ab jetzt programmatisch mit SQL.
Die CRUD-Operationen aus der vorherigen Lektion setzen wir dabei direkt mit den Befehlen der DML (Data Manipulation Language) um: INSERT entspricht Create, SELECT entspricht Read, UPDATE entspricht Update und DELETE entspricht Delete.
Mit DML können wir Daten also gezielt einfügen, ändern oder löschen – schnell, präzise und reproduzierbar.
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 (title, director, released_year, star1) VALUES ('Lost in Translation', 'Sofia Coppola', 2003, 'Scarlett Johansson');
Variante B: Mehrere Zeilen auf einmal
INSERT INTO favourite_film (title, director, released_year, star1) VALUES ('Inception', 'Christopher Nolan', 2010, 'Leonardo DiCaprio'), ('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 wir Daten aus einer grossen Tabelle (z. B. imdb_top_1000) in unsere eigene Tabelle übernehmen möchten.
INSERT INTO favourite_film (title, director, released_year, star1) SELECT Series_Title, Director, Released_Year, Star1 FROM imdb_top_1000 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'.
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 film_id = 2;
Mehrere Spalten in einem Datensatz auf einmal ändern
UPDATE favourite_film SET title = 'Arrival (Extended Cut)', star1 = 'Amy Adams' WHERE film_id = 3;
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 film_id = 1;
Mehrere Datensätze in einem Schritt (IN-Liste)
DELETE FROM favourite_film WHERE film_id IN (2, 3);
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 den AUTO_INCREMENT-Zähler 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.
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 film_id, title FROM favourite_film WHERE released_year >= 2020;
Wenn korrekt: erst dann UPDATE/DELETE mit derselben WHERE-Bedingung ausführen.