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

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.1759069035.txt.gz
  • Zuletzt geändert: 2025/09/28 16:17
  • von gkoch