UPDATE - Daten aktualisieren
Lerne, wie du mit UPDATE bestehende Datensätze änderst - sicher und gezielt mit WHERE-Bedingungen.
Mit UPDATE aenderst du bestehende Daten in deinen Tabellen. Das ist einer der wichtigsten und gleichzeitig gefaehrlichsten SQL-Befehle - denn ein UPDATE ohne WHERE aendert ALLE Zeilen!
Grundsyntax von UPDATE
UPDATE tabellenname
SET spalte1 = neuer_wert1,
spalte2 = neuer_wert2
WHERE bedingung;
Goldene Regel: Schreibe IMMER eine WHERE-Klausel bei UPDATE!
Einen einzelnen Datensatz aendern
-- E-Mail eines Kunden aktualisieren
UPDATE kunden
SET email = 'anna.schmidt@example.com'
WHERE id = 1;
Pruefe das Ergebnis:
SELECT * FROM kunden WHERE id = 1;
id | name | email | stadt | registriert_am
---+--------------+--------------------------+--------+---------------
1 | Anna Schmidt | anna.schmidt@example.com | Berlin | 2026-03-10
Mehrere Spalten gleichzeitig aendern
-- Name und Stadt eines Kunden aendern
UPDATE kunden
SET name = 'Anna Mueller',
stadt = 'Muenchen'
WHERE id = 1;
UPDATE mit Berechnungen
Du kannst den alten Wert in der Berechnung verwenden:
-- Preis um 10% erhoehen
UPDATE produkte
SET preis = preis * 1.10
WHERE id = 1;
-- Lagerbestand reduzieren
UPDATE produkte
SET lagerbestand = lagerbestand - 5
WHERE id = 3;
-- Preis runden
UPDATE produkte
SET preis = ROUND(preis, 2)
WHERE id = 1;
UPDATE mit WHERE-Bedingungen
Mehrere Datensaetze gleichzeitig aendern
-- Alle Produkte in der Kategorie 'Kleidung' um 5% reduzieren
UPDATE produkte
SET preis = ROUND(preis * 0.95, 2)
WHERE kategorie = 'Kleidung';
-- Alle offenen Bestellungen auf 'in Bearbeitung' setzen
UPDATE bestellungen
SET status = 'in Bearbeitung'
WHERE status = 'offen';
-- Lagerbestand aller guenstigen Produkte erhoehen
UPDATE produkte
SET lagerbestand = lagerbestand + 50
WHERE preis < 20;
UPDATE mit IN
-- Mehrere bestimmte Kunden aktualisieren
UPDATE kunden
SET stadt = 'Berlin'
WHERE id IN (2, 3);
UPDATE mit BETWEEN
-- Rabatt fuer Produkte im mittleren Preissegment
UPDATE produkte
SET preis = ROUND(preis * 0.9, 2)
WHERE preis BETWEEN 30 AND 80;
Die Gefahr: UPDATE ohne WHERE
-- VORSICHT! Das aendert ALLE Kunden!
UPDATE kunden
SET stadt = 'Berlin';
-- ALLE Kunden haben jetzt stadt = 'Berlin'!
-- NIEMALS ohne WHERE ausfuehren, wenn du nicht
-- wirklich ALLE Zeilen aendern willst!
Sicherheitsnetz: Vorher SELECT ausfuehren
Fuehre zuerst ein SELECT mit der gleichen WHERE-Bedingung aus:
-- Schritt 1: Pruefen, welche Zeilen betroffen sind
SELECT id, name, stadt
FROM kunden
WHERE stadt = 'Hamburg';
-- Schritt 2: Wenn das Ergebnis stimmt, UPDATE ausfuehren
UPDATE kunden
SET stadt = 'Hamburg-Nord'
WHERE stadt = 'Hamburg';
UPDATE mit Subqueries
Du kannst Subqueries verwenden, um den neuen Wert zu berechnen:
-- Setze den Preis auf den Durchschnittspreis der Kategorie
UPDATE produkte
SET preis = (
SELECT ROUND(AVG(p2.preis), 2)
FROM produkte p2
WHERE p2.kategorie = produkte.kategorie
)
WHERE id = 1;
-- Status auf 'vip' setzen fuer Kunden mit mehr als 100 Euro Umsatz
UPDATE kunden
SET stadt = stadt || ' (VIP)'
WHERE id IN (
SELECT kunden_id
FROM bestellungen
GROUP BY kunden_id
HAVING SUM(betrag) > 100
);
UPDATE mit JOIN (PostgreSQL)
In PostgreSQL kannst du beim UPDATE andere Tabellen einbeziehen:
-- PostgreSQL: UPDATE mit FROM (wie ein JOIN)
UPDATE bestellungen
SET status = 'premium'
FROM kunden
WHERE bestellungen.kunden_id = kunden.id
AND kunden.stadt = 'Berlin';
In SQLite musst du dafuer eine Subquery verwenden:
-- SQLite: UPDATE mit Subquery
UPDATE bestellungen
SET status = 'premium'
WHERE kunden_id IN (
SELECT id FROM kunden WHERE stadt = 'Berlin'
);
UPDATE … RETURNING (PostgreSQL)
Wie bei INSERT kannst du die geaenderten Daten zurueckbekommen:
-- PostgreSQL: Geaenderte Daten zurueckgeben
UPDATE produkte
SET preis = preis * 1.05
WHERE kategorie = 'Schuhe'
RETURNING id, name, preis;
Praxisbeispiele
Bestellstatus aktualisieren
-- Bestellung als versendet markieren
UPDATE bestellungen
SET status = 'versendet'
WHERE id = 4 AND status = 'offen';
Die zusaetzliche Bedingung AND status = 'offen' verhindert, dass versehentlich eine bereits abgeschlossene Bestellung geaendert wird.
Massenupdate mit Bedingungen
-- Alle Produkte mit niedrigem Lagerbestand als "Nachbestellen" markieren
-- (Angenommen, wir haetten eine Spalte 'hinweis')
UPDATE produkte
SET kategorie = kategorie || ' - SALE'
WHERE lagerbestand < 25 AND preis > 50;
Daten bereinigen
-- Leerzeichen am Anfang und Ende entfernen
UPDATE kunden
SET name = TRIM(name),
email = LOWER(TRIM(email));
Haeufige Fehler
1. WHERE vergessen
-- KATASTROPHE: Alle Preise werden 0!
UPDATE produkte SET preis = 0;
2. Falscher Vergleichsoperator
-- FALSCH: = statt == (aber in SQL ist = korrekt!)
-- In SQL ist = der Vergleichsoperator, NICHT ==
UPDATE kunden SET stadt = 'Berlin' WHERE id = 1; -- RICHTIG
3. String-Werte ohne Anfuehrungszeichen
-- FALSCH:
UPDATE kunden SET stadt = Berlin WHERE id = 1; -- Fehler!
-- RICHTIG:
UPDATE kunden SET stadt = 'Berlin' WHERE id = 1;
Was kommt als Naechstes?
Im naechsten Tutorial lernst du DELETE kennen - damit loeschst du Datensaetze aus deinen Tabellen.
Zusammenfassung
- UPDATE … SET … WHERE aendert bestehende Datensaetze
- Schreibe IMMER eine WHERE-Klausel (ausser du willst wirklich alle Zeilen aendern)
- Du kannst Berechnungen mit dem alten Wert machen (z.B.
preis = preis * 1.1) - Fuehre vorher ein SELECT mit der gleichen WHERE-Bedingung aus
- Subqueries und JOINs erweitern die Moeglichkeiten
- RETURNING (PostgreSQL) gibt die geaenderten Daten zurueck
Uebungen
- Einfach: Aendere die Stadt von Kunde 2 (Max Mueller) zu ‘Hamburg-Mitte’.
- Berechnung: Erhoehe den Preis aller Produkte der Kategorie ‘Accessoires’ um 2 Euro.
- Mehrere Spalten: Aktualisiere fuer Kunde 3 sowohl den Namen als auch die E-Mail.
- Subquery: Setze den Bestellstatus auf ‘abgeschlossen’ fuer alle Bestellungen von Kunden aus Berlin.
- Sicherheit: Schreibe zuerst das SELECT und dann das UPDATE, um alle Produkte mit einem Lagerbestand unter 30 um 20 Stueck aufzustocken.
-- Loesung zu Uebung 2:
UPDATE produkte
SET preis = preis + 2
WHERE kategorie = 'Accessoires';
-- Loesung zu Uebung 5:
-- Schritt 1: Pruefen
SELECT name, lagerbestand FROM produkte WHERE lagerbestand < 30;
-- Schritt 2: Update
UPDATE produkte SET lagerbestand = lagerbestand + 20 WHERE lagerbestand < 30;
Pro-Tipp: Bevor du ein kritisches UPDATE ausfuehrst, starte eine Transaktion mit BEGIN;. Fuehre dann das UPDATE aus und pruefe mit SELECT, ob alles stimmt. Wenn ja: COMMIT;. Wenn nein: ROLLBACK;. So kannst du Fehler rueckgaengig machen, bevor sie permanent werden.