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 oder geändert 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');
Ergebnis in Tabelle favourite_film:
film_id | title | director | released_year | star1 |
---|---|---|---|---|
1 | 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');
Ergebnis in Tabelle favourite_film:
film_id | title | director | released_year | star1 |
---|---|---|---|---|
1 | Lost in Translation | Sofia Coppola | 2003 | Scarlett Johansson |
2 | Inception | Christopher Nolan | 2010 | Leonardo DiCaprio |
3 | 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).
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;
Ergebnis in Tabelle favourite_film:
film_id | title | director | released_year | star1 |
---|---|---|---|---|
1 | Lost in Translation | Sofia Coppola | 2003 | Scarlett Johansson |
2 | Inception | C. Nolan | 2010 | Leonardo DiCaprio |
3 | Arrival | Denis Villeneuve | 2016 | Amy Adams |
Mehrere Spalten in einem Datensatz auf einmal ändern
UPDATE favourite_film SET title = 'Arrival (Extended Cut)', star1 = 'Amy Adams' WHERE film_id = 3;
Ergebnis in Tabelle favourite_film:
film_id | title | director | released_year | star1 |
---|---|---|---|---|
1 | Lost in Translation | Sofia Coppola | 2003 | Scarlett Johansson |
2 | Inception | C. Nolan | 2010 | Leonardo DiCaprio |
3 | Arrival (Extended Cut) | Denis Villeneuve | 2016 | Amy Adams |
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;
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;
Ergebnis in Tabelle favourite_film:
film_id | title | director | released_year | star1 |
---|---|---|---|---|
2 | Inception | C. Nolan | 2010 | Leonardo DiCaprio |
3 | Arrival (Extended Cut) | Denis Villeneuve | 2016 | Amy Adams |
Mehrere Datensätze in einem Schritt (IN-Liste)
DELETE FROM favourite_film WHERE film_id IN (2, 3);
Ergebnis in Tabelle favourite_film:
film_id | title | director | released_year | star1 |
---|---|---|---|---|
(keine Zeilen mehr vorhanden) |
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;
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;