Dies ist eine alte Version des Dokuments!


LU07b – SQL-DML: Daten einfügen, ändern, löschen

  • 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).

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.

Syntax (allgemein: Einzelzeile)

INSERT INTO tabellenname (spalte1, spalte2, spalte3)
VALUES (wert1, wert2, wert3);

Erklärung: Fügt eine neue Zeile ein. Spaltenreihenfolge und Werteposition müssen zusammenpassen.

Syntax (mehrere Zeilen in einem Statement)

INSERT INTO tabellenname (spalte1, spalte2, spalte3)
VALUES (wert1a, wert2a, wert3a),
       (wert1b, wert2b, wert3b),
       (wert1c, wert2c, wert3c);

Erklärung: Effizienter für Batch-Einfügungen, spart Traffic zur Datenbank.

Syntax (INSERT … SELECT – aus anderer Tabelle übernehmen)

INSERT INTO zieltabelle (spalte1, spalte2, spalte3)
SELECT quelle_spalte1, quelle_spalte2, quelle_spalte3
FROM quelle
WHERE bedingung;

Erklärung: Kopiert Daten ohne Zwischenexport direkt von Quelle → Ziel. Mit WHERE lässt sich filtern.

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;
Hinweise:
Zahlen/Jahr ohne Anführungszeichen, Texte in Anführungszeichen: 'Inception'.
Mit der WHERE-Bedingung können gezielt nur bestimmte Datensätze übernommen werden (z. B. ab Jahr 2000).

Syntax (mit Filter – empfohlen)

UPDATE tabellenname
SET spalte1 = neuer_wert1, spalte2 = neuer_wert2
WHERE bedingung;

Erklärung: Aktualisiert nur Zeilen, die die Bedingung erfüllen (z. B. Identifikator passt).

Syntax (ohne Filter – mit Vorsicht!)

UPDATE tabellenname
SET spalte1 = neuer_wert1;

Erklärung: Aktualisiert alle Zeilen der Tabelle – meist nicht gewünscht.

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;

Syntax (mit Filter – empfohlen)

DELETE FROM tabellenname
WHERE bedingung;

Erklärung: Entfernt nur die Zeilen, die die Bedingung erfüllen.

Syntax (ohne Filter – mit Vorsicht!)

DELETE FROM tabellenname;

Erklärung: Löscht alle Zeilen der Tabelle; die Tabellenstruktur bleibt erhalten.

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 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;

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;

1)
Automatisch hochzählende ID, eindeutiger Primärschlüssel
2)
Filmtitel
3)
Regisseur:in
4)
Veröffentlichungsjahr, vierstellig
5)
Hauptdarsteller:in
6)
Create, Read, Update, Delete Operationen
  • modul/m290_guko/learningunits/lu07/theorie/b_sql_dml.1759078908.txt.gz
  • Zuletzt geändert: 2025/09/28 19:01
  • von gkoch