- 1 Section
- 10 Lessons
- unbegrenzt
- SQL Grundlagen10
- 1.1SQL-Grundstruktur: DDL, DML, DQL, DCL
- 1.2CREATE TABLE, Datentypen, Constraints
- 1.3INSERT, UPDATE, DELETE
- 1.4SELECT: WHERE, ORDER BY, LIMIT
- 1.5Aggregatfunktionen: COUNT, SUM, AVG
- 1.6GROUP BY und HAVING
- 1.7INNER JOIN und LEFT JOIN
- 1.8Datenbanktypen im Überblick
- 1.9MySQL / MariaDB in der Praxis
- 1.10SQL-Grundlagenaufgaben
INSERT, UPDATE, DELETE
Mit CREATE TABLE hast du das Schema gebaut – jetzt müssen Daten hinein, sich ändern und gelegentlich wieder verschwinden. Das machen die drei DML-Befehle (Data Manipulation Language): INSERT für neue Daten, UPDATE für Änderungen, DELETE für Löschungen. Zusammen mit SELECT bilden sie die CRUD-Operationen – Create, Read, Update, Delete – das gesamte Alphabet der Datenverwaltung.
Diese Lektion ist überlebenswichtig: Wer DELETE ohne WHERE ausführt, hat sich gerade einen schlechten Tag eingehandelt. Wer INSERT, UPDATE, DELETE souverän einsetzt, kann jede datengetriebene Anwendung schreiben. Wir gehen die drei Befehle einzeln durch und simulieren ihre Wirkung live an einer Mini-Datenbank.
1) INSERT – Daten einfügen
Der einfachste DML-Befehl: INSERT INTO fügt eine neue Zeile in eine Tabelle ein. Es gibt zwei gebräuchliche Schreibweisen:
-- Variante 1: alle Spalten in Reihenfolge der Tabelle INSERT INTO kunde VALUES (1, 'Müller GmbH', 'Köln'); -- Variante 2: explizite Spaltenliste (empfohlen!) INSERT INTO kunde (id, name, stadt) VALUES (1, 'Müller GmbH', 'Köln'); -- Mehrere Zeilen auf einmal (Bulk-Insert) INSERT INTO kunde (id, name, stadt) VALUES (2, 'Meier AG', 'Berlin'), (3, 'Schulz oHG', 'Hamburg'), (4, 'Weber KG', 'München');
Variante 2 mit expliziter Spaltenliste ist fast immer die richtige Wahl. Sie hat zwei Vorteile: erstens kannst du Spalten in beliebiger Reihenfolge angeben, zweitens bleibt das Statement gültig, wenn später Spalten hinzukommen (sofern sie NULL erlauben oder DEFAULT haben). Bulk-Insert mit mehreren Wertgruppen ist deutlich schneller als viele einzelne INSERTs – wichtig bei Datenimporten.
2) UPDATE – Daten ändern
UPDATE ändert vorhandene Zeilen. Die zentrale Anweisung: welche Spalten bekommen welche neuen Werte, und welche Zeilen sind betroffen. Letzteres steht in der WHERE-Klausel – und genau hier passieren die meisten Unfälle:
-- Eine Zeile ändern UPDATE kunde SET stadt = 'Düsseldorf' WHERE id = 1; -- Mehrere Spalten gleichzeitig ändern UPDATE kunde SET stadt = 'Düsseldorf', plz = '40210' WHERE id = 1; -- Mehrere Zeilen mit Bedingung UPDATE produkt SET preis = preis * 1.05 -- 5% Preiserhöhung WHERE kategorie = 'Elektronik';
Bemerkenswert: Der neue Wert kann eine Berechnung aus dem alten Wert sein. preis = preis * 1.05 erhöht jeden Preis um 5 %. Das ist deutlich eleganter als „SELECT, Berechnung im Code, UPDATE" – alles in einer Query.
3) DELETE – Daten löschen
DELETE entfernt Zeilen. Die einfachste und gefährlichste Anweisung in SQL:
-- Konkrete Zeile löschen DELETE FROM kunde WHERE id = 1; -- Mit Bedingung mehrere DELETE FROM bestellung WHERE datum < '2020-01-01'; -- ⚠️ OHNE WHERE: löscht ALLE Zeilen! DELETE FROM kunde;
Die letzte Variante – DELETE FROM kunde; ohne WHERE – löscht alle Zeilen der Tabelle. Das ist beabsichtigt (zum gezielten Leeren), aber im Alltag fast immer ein Fehler. Mehr dazu im Warnabschnitt unten.
4) Live-Simulator: drei Operationen am Werk
Hier ist eine Mini-Datenbank mit drei Kunden. Probier die drei Operationen aus und beobachte, wie sich die Tabelle verändert. Grüne Zeilen sind neu, gelbe gerade geändert, rot durchgestrichene gerade gelöscht:
5) Die drei Operationen im direkten Vergleich
Hier eine übersichtliche Zusammenfassung der drei Befehle und ihrer wichtigsten Varianten:
INSERT
Fügt neue Zeilen hinzu. Kein WHERE – Daten werden immer angehängt. Bei PK-Konflikt: Fehler.
INSERT INTO kunde (name, stadt) VALUES ('Neu GmbH', 'Köln');
Tipp: Lass Auto-Increment-IDs aus, das DBMS vergibt sie selbst.
UPDATE
Ändert existierende Zeilen. WHERE bestimmt welche – ohne WHERE wird alles geändert!
UPDATE kunde SET stadt = 'Bonn' WHERE id = 5;
Rückgabe: Anzahl betroffener Zeilen. 0 heißt: WHERE traf nichts.
DELETE
Entfernt Zeilen. Endgültig. WHERE entscheidet welche – ohne WHERE: ALLE weg.
DELETE FROM kunde WHERE stadt = 'Test';
Vor produktiven DELETE-Statements: erst SELECT machen mit gleicher WHERE-Klausel!
6) Die WHERE-Klausel – das Herz aller Filter
WHERE entscheidet bei UPDATE und DELETE, welche Zeilen betroffen sind. Bei SELECT macht es dasselbe (mehr in der nächsten Lektion). Die wichtigsten Operatoren:
| Operator | Bedeutung | Beispiel |
|---|---|---|
= | Gleichheit | WHERE id = 5 |
<> oder != | Ungleichheit | WHERE stadt <> 'Köln' |
<, >, <=, >= | Größenvergleiche | WHERE preis >= 100 |
AND, OR, NOT | Logische Verknüpfung | WHERE stadt='Berlin' AND aktiv=TRUE |
BETWEEN ... AND ... | Wertebereich (inklusiv) | WHERE preis BETWEEN 10 AND 50 |
IN (...) | Wert in einer Liste | WHERE stadt IN ('Köln','Bonn','Düsseldorf') |
LIKE '...' | Muster mit % und _ | WHERE name LIKE 'Müller%' |
IS NULL / IS NOT NULL | NULL-Werte prüfen | WHERE email IS NULL |
Achtung bei NULL: Der Vergleich WHERE email = NULL funktioniert nicht, weil NULL ungleich allem ist – auch ungleich sich selbst. Du brauchst WHERE email IS NULL. Klassischer Anfängerfehler.
7) Die Sache mit dem fehlenden WHERE – Praxis-Warnung
DELETE FROM kunde WHERE id = 5, markierst den Befehl und drückst F5. Aber: Du hattest nur DELETE FROM kunde markiert, weil das WHERE in der nächsten Zeile stand. Ergebnis: alle Kunden weg.
Diese Geschichte ist real und passiert wöchentlich in irgendeiner Firma der Welt. Selbst erfahrene DBAs werden Opfer. Drei Schutzmechanismen:
- Transaktionen nutzen. Schreib
BEGIN;vor dem DELETE undCOMMIT;erst, wenn das Ergebnis stimmt. Falls falsch:ROLLBACK;macht alles rückgängig. Mehr in COMMIT & ROLLBACK. - "Safe Mode" in MySQL: Mit
SET SQL_SAFE_UPDATES = 1;verbietet MySQL Workbench UPDATEs und DELETEs ohne WHERE. Default in Workbench seit Jahren. - Erst SELECT, dann ersetzen.
SELECT * FROM kunde WHERE id = 5– richtige Zeile? Dann das SELECT gegen DELETE austauschen.
Aktuelle Datenbankbackups retten zumindest den schlimmsten Fall. Ohne Backup heißt es nach so einem Vorfall manchmal: Datenrekonstruktion aus Geschäftsbelegen über Wochen.
8) Mit Werten rechnen – Ausdrücke in INSERT/UPDATE
Sowohl in INSERT als auch in UPDATE können Werte berechnet werden. Das spart oft den Umweg über Anwendungscode:
-- Aktuelles Datum als Default INSERT INTO bestellung (kunde_id, datum, status) VALUES (5, CURRENT_DATE, 'offen'); -- Berechnung aus anderem Wert UPDATE bestellung SET mwst_betrag = netto * 0.19, brutto = netto * 1.19 WHERE bestell_nr = 101; -- String-Verkettung UPDATE kunde SET anrede = CONCAT('Herr/Frau ', name);
Funktionen wie CURRENT_DATE, NOW(), CONCAT(), UPPER(), LOWER() stehen in vielen INSERT/UPDATE-Statements. Sie machen Anwendungscode schlanker und Datenbankoperationen atomar (alles in einer Query, kein „Race Condition").
9) INSERT ... SELECT – Daten aus anderer Tabelle übernehmen
Eine elegante Variante: INSERT mit einem SELECT als Datenquelle. So kopierst du Daten aus einer Tabelle in eine andere, ohne sie in einer Anwendung verarbeiten zu müssen:
-- Alte Bestellungen in Archiv übernehmen INSERT INTO bestellung_archiv (id, datum, summe) SELECT id, datum, summe FROM bestellung WHERE datum < '2020-01-01'; -- Im selben Schritt aus Original löschen (zwei separate Statements!) DELETE FROM bestellung WHERE datum < '2020-01-01';
Diese Technik ist Standardpraxis bei Archivierungen, Migrationen und Datenexporten. Wichtig: beide Statements gehören in eine Transaktion, damit nicht Daten weg sind, wenn die zweite Anweisung fehlschlägt.
Zusammenfassung
Die drei DML-Befehle sind das Arbeitspferd jeder datenverarbeitenden Anwendung. INSERT fügt neue Zeilen ein – am besten mit expliziter Spaltenliste, Bulk-Insert für viele Zeilen auf einmal. UPDATE ändert vorhandene Zeilen – die WHERE-Klausel ist entscheidend. DELETE löscht Zeilen – ohne WHERE alle, mit WHERE nur die ausgewählten. Die WHERE-Klausel beherrscht zahlreiche Operatoren: Vergleiche, AND/OR/NOT, BETWEEN, IN, LIKE, IS NULL. Berechnungen und Funktionen können in INSERT/UPDATE direkt verwendet werden (z. B. preis * 1.05, CURRENT_DATE). INSERT ... SELECT kopiert Daten zwischen Tabellen. Größte Gefahr: UPDATE oder DELETE ohne WHERE betrifft alle Zeilen. Schutzmechanismen: Transaktionen (BEGIN/COMMIT/ROLLBACK), Safe-Mode des Tools, „erst SELECT, dann ersetzen", und immer aktuelle Backups. Zusammen mit SELECT bilden die drei Befehle das CRUD – das vollständige Alphabet der Datenverwaltung.
Verwandte Lektionen: SELECT: Grundabfragen · CREATE TABLE · COMMIT & ROLLBACK · und mehrWeitere relevante LektionenSQL-GrundstrukturTransaktionenReferenzielle IntegritätDatenbankbackupSQL-InjectionInput-ValidierungAggregatfunktionen
