UPDATE: Werte ändern
Kurz gesagt: UPDATE … SET … WHERE ändert Spalten in den Zeilen, die die Bedingung erfüllen, mit einem Ausdruck, der den alten Wert benutzen kann; ohne WHERE ändert es jede Zeile.
Problem
Eine Preiserhöhung
Der Lieferant der Milchprodukte erhöht die Preise um 10 %. Ab heute muss auch der Shop alles in der Kategorie „Milchprodukte“ um 10 % teurer verkaufen.
Es sind fünf Produkte. Du könntest die Preise von Hand ändern, eins nach dem anderen. Aber morgen ist es eine Kategorie mit 200 Produkten, und Abschreiben von Hand geht garantiert schief.
Die Idee
UPDATE … SET … WHERE
UPDATE sagt, welche Tabelle, SET sagt, welche Spalte und was sie wird, und WHERE sagt, in welchen Zeilen:
price * 1.1 wird für jede Zeile einzeln berechnet, mit dem Preis dieser Zeile. Die Frischmilch kostete 1,60 € und kostet jetzt 1,76 €. ROUND(…, 2) rundet auf den Cent, denn der Preis ist in Euro und Cent. Über dem Ergebnis siehst du, wie viele Zeilen die Anweisung geändert hat: fünf.
Genauer, für Neugierige
Ohne ROUND zeigt der Bildschirm auch 1.76. Aber für den Computer ist 1.6 × 1.1 gleich 1.7600000000000002, weil Kommazahlen binär gespeichert werden und nicht immer exakt. Dann findet eine Suche nach dem Preis 1.76 die Frischmilch nicht:
Runde Geld also, wenn du es speicherst. Echte Shops speichern Preise oft in ganzen Cent (176) oder in einer Spalte mit einem exakten Dezimaltyp, den PostgreSQL und MySQL haben (DECIMAL). SQLite hat so einen Typ nicht.
SET kann mehrere Spalten enthalten, durch Kommas getrennt. 30 Banitsas kommen an, und ihr Preis wird 2,60 €:
stock + 30 nimmt den alten Bestand und addiert 30. Im Ausdruck rechts von = haben die Spalten die alten Werte der Zeile.
Probier es aus
Eine Bestellung ist unterwegs
Bestellung 59 ist bezahlt und ist heute mit dem Kurier rausgegangen. Ändere ihren Status auf shipped.
Lösung
UPDATE orders SET status = 'shipped' WHERE id = 59;UPDATE orders SET status = 'shipped' WHERE id = 59. Die Prüfung sieht sich jede bezahlte und jede versendete Bestellung an. So zeigt sie, wenn du auch eine andere Bestellung geändert hast.
Sieh es dir an
UPDATE ohne WHERE
Die Shopleitung will eine Aktion: Pfefferminztee für 0,99 €. Jemand tippt in Eile und vergisst WHERE:
Alle 25 Produkte kosten jetzt 0,99 €, sogar das Messerset, das 39 € gekostet hat. Die Datenbank fragt nicht „bist du sicher?“. Ohne WHERE gilt die Anweisung für jede Zeile.
Hier behebt der Knopf „Neue Datenbank“ alles. Eine echte Datenbank hat keinen solchen Knopf. Es bleiben Backups und Transaktionen: Mit einer Transaktion lässt sich eine Änderung zurücknehmen, bevor sie bestätigt ist. Sie lernst du später im Kurs kennen.
Die Idee
Erst SELECT
Die Gewohnheit, die dich davor schützt: Führ vor einem UPDATE ein SELECT mit demselben WHERE aus. Du siehst genau, welche Zeilen sich ändern werden, und nichts ändert sich.
Getränke werden um 5 % teurer. Die Kategorie ist am Namen bekannt, und eine Unterabfrage liefert ihre Nummer:
Vier Produkte, genau die richtigen. Jetzt wird aus SELECT … FROM ein UPDATE … SET, und WHERE bleibt gleich:
Hier macht ROUND einen sichtbaren Unterschied: 0,90 × 1,05 ist 0,945, und 14,90 × 1,05 ist 15,645. Die Preise werden 0,95 € und 15,65 €.
Eine Unterabfrage in WHERE funktioniert in UPDATE genauso wie in SELECT.
Probier es aus
Die vergessenen Bestellungen
Es gibt Bestellungen mit dem Status new von vor 2026, die niemand bezahlt hat. Storniere sie: Ihr Status wird cancelled.
Lösung
UPDATE orders SET status = 'cancelled'
WHERE status = 'new' AND ordered_at < '2026-01-01';UPDATE orders SET status = 'cancelled' WHERE status = 'new' AND ordered_at < '2026-01-01'. Zwei Bestellungen, 4 und 10. Wenn du vorher ein SELECT mit demselben WHERE ausführst, siehst du genau sie.
Übung
Zwei Aufgaben
1. Eine Aktion für die Produkte, von denen der Shop reichlich hat: Jedes Produkt mit mehr als 50 auf Lager wird 20 % billiger, auf den Cent gerundet. Die Geschenkkarte hat keine Kategorie und gehört nicht zur Aktion.
Die Aktion (geprüft wird die ganze Tabelle products):
Lösung
UPDATE products
SET price = ROUND(price * 0.8, 2)
WHERE stock > 50 AND category_id IS NOT NULL;UPDATE products SET price = ROUND(price * 0.8, 2) WHERE stock > 50 AND category_id IS NOT NULL. Fünf Produkte: das Butterbrötchen, die Äpfel, die Kartoffeln, das Wasser und die Putzschwämme. Das Butterbrötchen kostet danach 0,64 €. Ohne die zweite Bedingung würde die Geschenkkarte für 20 € zu 16 € verkauft.
2. Maria Ivanova (maria.ivanova@example.com) hat alle ihre neuen Bestellungen auf einmal bezahlt. Ändere deren Status auf paid. Finde die Kundin über die E-Mail-Adresse, mit einer Unterabfrage.
Marias neue Bestellungen werden bezahlt:
Lösung
UPDATE orders SET status = 'paid'
WHERE status = 'new'
AND customer_id = (SELECT id FROM customers WHERE email = 'maria.ivanova@example.com');UPDATE orders SET status = 'paid' WHERE status = 'new' AND customer_id = (SELECT id FROM customers WHERE email = 'maria.ivanova@example.com'). Die Bestellungen 34 und 46. Die E-Mail-Adresse ist eindeutig, die Unterabfrage liefert also genau einen Kunden.
Test
Teste dich
Verwandte Lektionen
Abschnitt „Verwandte Lektionen“- Baut auf: NULL: kein Wert · Rechnen in einer Abfrage · Unterabfragen · INSERT: Zeilen einfügen
- Geht weiter in: DELETE: Zeilen löschen · Upsert: einfügen oder ändern · Views · Normalisierung
- Aufgaben zum Thema: Daten ändern