Zum Inhalt springen
SQL Anfänger 20 min

UPDATE - Daten aktualisieren

Lerne, wie du mit UPDATE bestehende Datensätze änderst - sicher und gezielt mit WHERE-Bedingungen.

Aktualisiert:

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

  1. Einfach: Aendere die Stadt von Kunde 2 (Max Mueller) zu ‘Hamburg-Mitte’.
  2. Berechnung: Erhoehe den Preis aller Produkte der Kategorie ‘Accessoires’ um 2 Euro.
  3. Mehrere Spalten: Aktualisiere fuer Kunde 3 sowohl den Namen als auch die E-Mail.
  4. Subquery: Setze den Bestellstatus auf ‘abgeschlossen’ fuer alle Bestellungen von Kunden aus Berlin.
  5. 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.

Zurück zum SQL Kurs