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.