WHERE betrifft alle Zeilen der Tabelle!
INSERT — Daten einfügen
INSERT INTO fügt neue Zeilen in eine Tabelle ein. Die Spalten werden in Klammern aufgelistet, danach folgen die Werte mit VALUES.
-- Einen Datensatz einfügen (empfohlen: explizite Spalten)
INSERT INTO kunden (vorname, nachname, land)
VALUES ('Hans', 'Meier', 'CH');
-- Mehrere Datensätze auf einmal
INSERT INTO kunden (vorname, nachname)
VALUES ('Anna', 'Müller'),
('Roni', 'Bauer'),
('Milan', 'Keller');
-- Aus einer anderen Tabelle kopieren (INSERT + SELECT)
INSERT INTO kunden_archiv (vorname, nachname)
SELECT vorname, nachname FROM kunden
WHERE land = 'DE';
Spalten mit NOT NULL ohne DEFAULT-Wert müssen immer angegeben werden — sonst wirft SQL einen Fehler.
UPDATE — Daten ändern
UPDATE ändert Felder in bestehenden Datensätzen. Mit SET werden die neuen Werte angegeben. Mehrere Spalten werden durch Komma getrennt.
-- Einen bestimmten Kunden aktualisieren
UPDATE kunden
SET nachname = 'Meyer', land = 'DE'
WHERE kundenid = 2;
-- Alle Kunden mit Nachname 'Meier' umbenennen
UPDATE kunden
SET nachname = 'Meyer'
WHERE nachname = 'Meier';
SELECT prüfen welche Zeilen betroffen wären.
-- GEFÄHRLICH: Alle Kunden erhalten land = 'DE'
UPDATE kunden SET land = 'DE';
-- BESSER: Erst prüfen
SELECT * FROM kunden WHERE nachname = 'Meyer';
-- Dann erst UPDATE ausführen
DELETE — Daten löschen
DELETE FROM löscht ganze Zeilen aus einer Tabelle. Mit WHERE wird eingeschränkt welche Zeilen betroffen sind.
-- Einen bestimmten Datensatz löschen
DELETE FROM produkte WHERE produktid = 5;
-- Alle inaktiven Kunden löschen
DELETE FROM kunden WHERE status = 'inaktiv';
DELETE vs. TRUNCATE:
| Merkmal | DELETE | TRUNCATE |
|---|---|---|
| Einzelne Zeilen löschbar | ✅ Ja (mit WHERE) | ❌ Nein (immer alles) |
| Protokollierung | ✅ Ja (langsamer) | ❌ Nein (schneller) |
| IDENTITY-Zähler | Wird nicht zurückgesetzt | Wird zurückgesetzt |
| WHERE-Klausel | ✅ Möglich | ❌ Nicht möglich |
Referentielle Integrität & Cascading
Wenn ein Fremdschlüssel aus einer anderen Tabelle auf den zu löschenden Datensatz zeigt, schlägt das DELETE mit einem Fehler fehl:
-- Fehler! Kunde 2 hat noch Bestellungen → FK-Verletzung
DELETE FROM kunden WHERE kundenid = 2;
Lösung 1: Abhängige Datensätze zuerst löschen. Lösung 2: ON DELETE CASCADE beim Fremdschlüssel aktivieren — dann werden Child-Datensätze automatisch mitgelöscht:
-- Fremdschlüssel mit Cascade-Option
ALTER TABLE bestellungen
ADD CONSTRAINT fk_bestell_kunde
FOREIGN KEY (kundenid)
REFERENCES kunden(kundenid)
ON DELETE CASCADE;
-- Jetzt löscht dieses Statement den Kunden UND seine Bestellungen
DELETE FROM kunden WHERE kundenid = 2;