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

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.

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

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 wir Daten aus einer grossen Tabelle (z. B. imdb_top_1000) in unsere eigene Tabelle übernehmen möchten.

Voraussetzung: Die Spalten passen zueinander. In unserem Fall fehlt in imdb_top_1000 die Spalte ISAN. Wir müssen also beim Einfügen einen künstlichen Wert erzeugen, z. B. mit der SQL-Funktion UUID().

INSERT INTO favourite_film (ISAN, title, director, released_year, star1)
SELECT UUID(), 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).
UUID() erzeugt eine eindeutige ID als Ersatz für das fehlende ISAN.
Tipps:
Zahlen/Jahr ohne Anführungszeichen, Texte in Anführungszeichen: 'Inception'.
Fehlermeldung „duplicate key“? → Der ISAN existiert bereits (Primärschlüssel).

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

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

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.


1)
ISAN steht für „International Standard Audiovisual Number“. Eindeutige Kennung für audiovisuelle Werke – vergleichbar mit ISBN bei Büchern.
2)
Filmtitel
3)
Regisseur:in
4)
Veröffentlichungsjahr, vierstellig
5)
Hauptdarsteller:in
  • modul/m290_guko/learningunits/lu07/theorie/b_sql_dml.1759070097.txt.gz
  • Zuletzt geändert: 2025/09/28 16:34
  • von gkoch