SQL DELETE entfernt Zeilen aus einer Tabelle – der DML-Befehl zum Löschen von Daten. Zusammen mit INSERT (Anlegen) und UPDATE (Ändern) vervollständigt es die Schreibseite von SQL.
Grundform
DELETE FROM kunden WHERE id = 7;
Ohne WHERE-Bedingung leert DELETE die komplette Tabelle:
DELETE FROM kunden; -- löscht ALLE Zeilen!
Die Tabelle selbst bleibt dabei bestehen – nur ihre Zeilen verschwinden. Weil ein versehentliches DELETE ohne WHERE kaum rückholbar ist, gilt: erst die Treffermenge per SELECT COUNT(*) … mit derselben Bedingung prüfen, dann löschen.
DELETE mit Subquery und JOIN
Welche Zeilen gelöscht werden, darf von anderen Tabellen abhängen:
DELETE FROM bestellungen WHERE kunden_id IN
(SELECT id FROM kunden WHERE status = 'geloescht');
MySQL und MariaDB unterstützen auch das Mehr-Tabellen-DELETE mit JOIN-Syntax:
DELETE b FROM bestellungen b JOIN kunden k ON k.id = b.kunden_id
WHERE k.status = 'geloescht';
Hier steht nach DELETE der Alias der Tabelle, aus der gelöscht werden soll. In Mehr-Tabellen-DELETEs sind ORDER BY und LIMIT bei MySQL nicht erlaubt – große Bereinigungen dann über eine Unterabfrage der IDs lösen.
DELETE und Fremdschlüssel
Existieren Fremdschlüssel-Verweise auf die Zeilen, verhindert die Datenbank das Löschen, solange noch abhängige Datensätze existieren (RESTRICT) – oder löscht sie bei ON DELETE CASCADE automatisch mit. Wer die Zusammenhänge kennt, vermeidet Überraschungen: Primär- und Fremdschlüssel.
DELETE vs. TRUNCATE
Zum Leeren einer Tabelle gibt es mit TRUNCATE TABLE eine schnellere Alternative – mit wichtigen Unterschieden:
- DELETE ist DML: löscht zeilenweise, ist in einer Transaktion zurückrollbar und löst Trigger aus.
- TRUNCATE ist DDL: verwirft und baut die Tabelle neu auf, ist sehr schnell, setzt AUTO_INCREMENT zurück und lässt sich in MySQL/MariaDB nicht per WHERE einschränken. Wer die Tabelle selbst komplett entfernen will, nutzt DROP TABLE.
Praxis-Tipps
- Constraints und Trigger reagieren auch auf DELETE – ein Löschversuch kann an CHECK--Regeln zwar nicht scheitern, aber Trigger (etwa für Audit-Logs) laufen mit: Trigger.
- Große Löschaktionen in Batches mit LIMIT (einzeln oder per Schleife) ausführen, statt Millionen Zeilen in einem Statement zu löschen – das hält die Datenbank reaktionsfähig.
- Vor dem endgültigen Löschen hilft ein Backup oder ein „Soft Delete“ (Status-Flag statt DELETE), solange das fachlich möglich ist.
- Die gelöschte Zeilenzahl liefert
ROW_COUNT().
Mehr zur Datenbank-Programmierung: SQL CTE und SQL-Subquery.