Direkt zum Inhalt

SQL DELETE: Wie man Daten sicher löscht

Lerne, wie du mit SQL DELETE Datensätze aus einer Tabelle löschen kannst. Lerne die wichtigsten Syntaxregeln, Sicherheitsabläufe und Optimierungstechniken für den Umgang mit großen Datensätzen.
Aktualisiert 12. Jan. 2026  · 9 Min. lesen

Daten löschen kann in SQL echt riskant sein. Ein einziger schlecht geschriebener Befehl kann die Beziehungen zwischen Tabellen durcheinanderbringen oder sogar einen ganzen Datensatz löschen.

In diesem Tutorial zeige ich dir, wie die Anweisung „ DELETE “ funktioniert, wie du sie richtig einsetzt und wie du häufige Fehler vermeidest, wie zum Beispiel das Löschen eines ganzen Datensatzes, wie ich gerade erwähnt habe. 

Wenn du noch keine Erfahrung mit SQL hast, fang mit unserem Kurs „Einführung in SQL“ an. Wenn du schon ein bisschen Erfahrung hast, kannst du mit dem Kurs „SQL für Fortgeschrittene“ loslegen. 

Was macht DELETE in SQL?

Bevor wir uns die Syntax anschauen, solltest du wissen, was die Anweisung „ DELETE “ eigentlich macht. Hier sind die verschiedenen Arten, wie man Daten in SQL löschen kann.

SQL DELETE vs. konzeptionelles Entfernen von Zeilen

Die Anweisung „ DELETE “ löscht eine oder mehrere Zeilen aus einer Tabelle, ohne die Struktur der Tabelle zu verändern. Deshalb bleibt das Schema der Tabelle, das die Spaltennamen, Datentypen, Indizes und Einschränkungen enthält, unverändert. Nach dem Löschen ist die Tabelle immer noch da und kann neue Daten aufnehmen.

Stell dir das so vor, als würdest du Einträge aus einem Hauptbuch löschen, nicht die Seiten rausreißen. Das Schema bleibt gleich; nur die ausgewählten Datensätze werden gelöscht.

SQL DELETE vs. DROP vs. TRUNCATE

Obwohl DELETE, DROP und TRUNCATE alle Daten in irgendeiner Form löschen,haben sieganz unterschiedliche Zwecke. Die folgende Tabelle zeigt, wofür die einzelnen Anweisungen verwendet werden:

Funktionen

LÖSCHEN

TRUNCATE

DROP

Befehlstyp

DML (Sprache der Datenbearbeitung)

DDL (Datenbeschreibungssprache)

DDL (Datenbeschreibungssprache)

Umfang

Entfernt bestimmte Zeilen (mit der Klausel „ WHERE “)

Entfernt alle Zeilen aus einer Tabelle

Löscht die ganze Tabelle und ihre Daten.

Geschwindigkeit

Langsamer (entfernt Zeile für Zeile)

Schneller (gibt Seiten frei)

Sofort

Umkehrbarkeit

Kann rückgängig gemacht werden

Nicht umkehrbar

Nicht rückgängig machbar.

Tabellenstruktur

Konserviert

Erhalten (und IDs zurücksetzen)

Komplett gelöscht

Grundlegende SQL-DELETE-Syntax

Jetzt, wo du weißt, wie die Anweisung „ DELETE “ funktioniert, schauen wir uns mal ihre Syntax an und wie man sie anwendet. 

Bestimmte Zeilen mit WHERE löschen

Die Klausel „ WHERE “ legt den Bereich einer „ DELETE “-Operation fest. Die Klausel „ WHERE “ muss immer dabei sein, weil sie der Datenbank genau sagt, welche Zeilen entfernt werden sollen.

-- Basic DELETE syntax
DELETE FROM table_name
WHERE condition;

Alle Zeilen in einer Tabelle löschen

Wenn du die Klausel „ WHERE “ in der Anweisung „ DELETE “ weglässt, geht SQL davon aus, dass du jede einzelne Zeile in der Tabelle ansprechen möchtest. Wenn du das aus Versehen machst, geht die Datenbank-Engine jeden einzelnen Datensatz durch und löscht ihn. Für jede gelöschte Zeile wird ein Eintrag im Transaktionsprotokoll gemacht. Wenn du Millionen von Zeilen hast, kann das echt langsam sein und deine Logdateien überladen.

Sichere Vorgehensweisen bei SQL DELETE

Da ein „ DELETE “-Vorgang dauerhaft sein kann, helfen dir sichere Löschverfahren dabei, langsamer vorzugehen, deine Absicht zu überprüfen und zu planen, wie du Daten wiederherstellen kannst, falls etwas schiefgeht.

Zeilen vor dem Löschen anzeigen

Bevor du eine „ DELETE “-Anweisung ausführst, solltest du immer mit einer „ SELECT “-Anweisung eine Vorschau der Zeilen anzeigen, die du entfernen willst. Verwende dabei dieselbe „ WHERE “-Bedingung, die du auch in deiner „ DELETE “-Anweisung verwenden willst. Wenn die Anweisung „ SELECT “ zu viele oder falsche Zeilen zurückgibt, kannst du das Problem beheben, bevor es zu Problemen kommt. 

2023-01-01Die folgende Abfrage sucht zum Beispiel nach Zeilen mit stornierten Bestellungen vor dem 1. Oktober 2017 und löscht dann mit denselben Filtern diese Datensätze.

-- Step 1: Preview the targets
SELECT * FROM Orders 
WHERE Status = 'Cancelled' AND OrderDate < '2023-01-01';

-- Step 2: Once you've verified the list, convert to DELETE
DELETE FROM Orders 
WHERE Status = 'Cancelled' AND OrderDate < '2023-01-01';

Transaktionen und Rollback nutzen

Wenn du die Operation „ DELETE “ in eine Transaktion einbaust, kannst du einen Befehl ausführen, sehen, wie viele Zeilen davon betroffen waren, und dann entscheiden, ob du die Änderung dauerhaft machen oder komplett rückgängig machen willst. Du kannst dann den „ ROLLBACK “ nutzen, um die Daten wieder in ihren vorherigen Zustand zu bringen.

Die folgende Abfrage löscht vorübergehend die entsprechenden Zeilen und stellt sie dann wieder her, sodass du die Auswirkungen überprüfen kannst, ohne Daten zu verlieren.

BEGIN TRANSACTION;

DELETE FROM Users
WHERE LastLogin < '2020-01-01';

-- Inspect the affected row count
ROLLBACK;

Dann kannst du die folgende Abfrage nutzen, um Nutzer, die sich zuletzt vor dem 1. Januar 2020 angemeldet haben, endgültig zu löschen.

BEGIN TRANSACTION;

DELETE FROM Users
WHERE LastLogin < '2020-01-01';

-- Confirm deletion of the required rows
COMMIT;

Beachte aber, dass „ ROLLBACK ” nur möglich ist, wenn du die Transaktion noch nicht bestätigt hast.

SQL DELETE mit Joins und Unterabfragen

In echten Datenbanken sind Daten selten für sich allein. Meistens musst du Zeilen löschen, die auf Werten aus anderen Tabellen, abgelaufenen Konten, verwaisten Datensätzen oder nicht mehr zutreffenden zugehörigen Entitäten basieren.

Löschen von Zeilen basierend auf einer anderen Tabelle

Unterabfragen sind die beste und am weitesten verbreitete Methode, um Zeilen basierend auf einer anderen Tabelle zu löschen. Sie funktionieren mit fast allen SQL-Versionen. Die folgende Abfrage löscht zum Beispiel inaktive Benutzer aus der Tabelle „ Users “, deren Konten in der Tabelle „ Accounts “ deaktiviert wurden.

-- Delete users whose accounts have been deactivated
DELETE FROM Users
WHERE AccountId IN (
    SELECT AccountId
    FROM Accounts
    WHERE Status = 'DEACTIVATED'
);

Du kannst Joins auch zum Löschen von Zeilen in einer Datenbank verwenden, aber die Syntax ist je nach Datenbank unterschiedlich, wie wir im nächsten Abschnitt sehen werden.

Datenbankspezifische DELETE-Syntax

Auch wenn die Idee hinter der Anweisung „ DELETE “ in SQL dieselbe ist, haben verschiedene Datenbanken unterschiedliche Syntax, wenn man „ JOIN “ benutzt, um Zeilen aus einer Tabelle basierend auf einer anderen zu löschen.

SQL Server fügt die Zieltabelle nach der Anweisung „ DELETE “ ein und fügt dann „ FROM “ hinzu. Im folgenden Beispiel gibt der Alias nach „ DELETE “ (u) an, welche Tabelle gelöscht wird.

-- SQL Server: Delete users linked to deactivated accounts
DELETE u
FROM Users u
JOIN Accounts a
  ON u.AccountId = a.AccountId
WHERE a.Status = 'DEACTIVATED';

In PostgreSQL verhält sich das „ USING ” wie ein „ JOIN ”. Nur die Zeilen aus der Zieltabelle (Users) werden gelöscht.

-- PostgreSQL: Delete users linked to deactivated accounts
DELETE FROM Users
USING Accounts
WHERE Users.AccountId = Accounts.AccountId
  AND Accounts.Status = 'DEACTIVATED';

MySQL lässt das Löschen mehrerer Tabellen zu, verlangt aber, dass die Tabellen ausdrücklich benannt werden. Du musst die zu löschende Tabelle vor der Klausel „ FROM “ platzieren.

-- MySQL: Delete users linked to deactivated accounts
DELETE u
FROM Users u
JOIN Accounts a
  ON u.AccountId = a.AccountId
WHERE a.Status = 'DEACTIVATED';

Ich empfehle dir , unseren Kurs „Joining Data in SQL” zu machen , umdie verschiedenen Arten von Joins in SQL kennenzulernenund zu lernen, wie man mit verschiedenen verwandten Tabellen in der Datenbank arbeitet.

SQL DELETE und referenzielle Integrität

Wie wir jetzt wissen, gibt's Tabellen in relationalen Datenbanken fast nie alleine. Sie sind oft über Fremdschlüssel miteinander verbunden. Wegen dieser Verknüpfungen kann das Löschen einer Zeile in einer Tabelle ungewollte Folgen haben.

Fremdschlüssel und Einschränkungsfehler

Wenn eine Tabelleüber einen Fremdschlüsselreferenziert wird, legt die Datenbanken fest, was passiert, wenn du versuchst, eine übergeordnete Zeile zu löschen. Standardmäßig verhindern die meisten Datenbanken das Löschen, wenn in einer untergeordneten Tabelle noch zugehörige Zeilen vorhanden sind.

Wenn du zum Beispiel eine Tabelle „ Orders ” hast, die auf die Tabelle „ Customers ” verweist, wird das Löschen eines Kunden, der noch Bestellungen hat, mit einem Constraint-Fehler fehlschlagen. Das verhindert, dass die Datenbank verwaisten Datensätze enthält, die keinen gültigen übergeordneten Datensatz mehr haben.

Kaskadierende Löschungen

Wenn du zugehörige Daten automatisch löschen willst, musst du eine Kaskadenregel festlegen, die der Datenbank sagt, wie sie mit den zugehörigen Daten umgehen soll. Die Methode „ ON DELETE CASCADE “ sagt der Datenbank, dass sie automatisch die zugehörigen untergeordneten Zeilen löschen soll, wenn eine übergeordnete Zeile entfernt wird.

Die folgende Abfrage sagt der Datenbank zum Beispiel, dass sie automatisch alle Zeilen in der Tabelle „ Orders ” löschen soll, die auf einen Kunden verweisen, wenn dieser Kunde aus der Tabelle „ Customers ” gelöscht wird.

-- Parent table
CREATE TABLE Customers (
    CustomerId INT PRIMARY KEY,
    Name VARCHAR(100)
);

-- Child table with a cascading foreign key
CREATE TABLE Orders (
    OrderId INT PRIMARY KEY,
    CustomerId INT,
    OrderDate DATE,
    CONSTRAINT fk_orders_customers
        FOREIGN KEY (CustomerId)
        REFERENCES Customers(CustomerId)
        ON DELETE CASCADE
);

Der Vorteil von diesem Ansatz ist, dass die Datenbank sauber bleibt, ohne dass mehrere manuelle ` DELETE `-Anweisungen nötig sind. Du solltest die Anweisung aber vorsichtig einsetzen, weil ein einzelner Löschvorgang eine Kettenreaktion über mehrere Tabellen auslösen und viel mehr Daten als erwartet löschen kann. Du könntest zum Beispiel eine Zeile in der Tabelle „ Departments “ löschen und dabei aus Versehen 500 Zeilen in der Tabelle „ Employees “ wegschmeißen.

Leistungsaspekte beim Löschen von Daten

Wenn du die Anweisung „ DELETE “ benutzt, wirst du merken, dass das Löschen einiger Zeilen sofort geht, aber langsam ist, wenn du Millionen von Zeilen hast. Beachte die folgenden bewährten Methoden, um Datensätze sicher zu löschen:

DELETE vs. TRUNCATE für große Tabellen

Wie wir schon gesehen haben, löschen sowohl DELETE als auch TRUNCATE Datensätze auf folgende Weise:

  • DELETE: Es geht jede Zeile durch, schaut, ob sie den Kriterien entspricht, entfernt sie und schreibt die Änderung ins Transaktionsprotokoll. Das braucht viele Ressourcen und ist bei riesigen Datensätzen echt langsam. Es ermöglicht das Filtern mit einer „ WHERE “-Klausel und unterstützt Rollbacks.

  • TRUNCATE: Löscht alle Zeilen auf einmale mit minimaler Protokollierung. Es ist deutlich schneller, kann aber nicht gefiltert werden, lässt sich normalerweise nicht rückgängig machen und wird durch Fremdschlüsselbeschränkungen blockiert.

Massenlöschungen und lang andauernde Vorgänge

Wenn du Millionen von Zeilen in einer einzigen Anweisung löschst, kann das deine ganze Anwendung ziemlich verlangsamen und sogar deine Datenbank zum Absturz bringen, wenn du das nicht richtig machst. Um dieses Risiko zu verringern, solltest du große Datensätze immer in mehreren Schritten löschen.

Beim Batch-Löschen werden nur ein paar Tausend Zeilen auf einmal gelöscht, also nicht so viele auf einmal. Dadurch bleibt die Datenbank reaktionsschnell und der Fortschritt lässt sich leicht überwachen. Wenn was schiefgeht, kannst du den Vorgang stoppen, ohne eine riesige Transaktion rückgängig machen zu müssen.

Häufige Fehler bei SQL DELETE

Hier sind die häufigsten Fehler, auf die du achten solltest, wenn du die DELETE-Anweisung zum Entfernen von Zeilen in deinen Tabellen verwendest:

Die WHERE-Klausel vergessen

Das Vergessen der „ WHERE “-Klausel ist der häufigste Fehler bei der Verwendung von „ DELETE “. Ohne sie löscht die Anweisung jede Zeile in der Tabelle. Stell immer sicher, dass du die Klausel „ WHERE “ benutzt, um die zu löschenden Zeilen anzugeben. Als Vorsichtsmaßnahme solltest du die zuvor besprochene Gewohnheit „ SELECT-before-DELETE “ anwenden, um die Zeilen vor dem Löschen anzusehen.

Angenommen, DELETE ist rückgängig machbar

Ein weiteres häufiges Missverständnis ist, dass gelöschte Daten immer wiederhergestellt werden können. Beachte, dass die Anweisung „ DELETE “ standardmäßig die Daten nach dem Commit als physisch von der Festplatte entfernt markiert, es sei denn, du hast Backups, Replikate oder Audit-Protokolle eingerichtet.

Du kannst den Befehl „ DELETE “ nur rückgängig machen, wenn:

  • Es wird innerhalb einer Transaktion gemacht.
  • Die Transaktion wurde noch nicht bestätigt.
  • Die Datenbank und die Speicher-Engine unterstützen Rollbacks.

SQL DELETE in Produktionsumgebungen

In Produktionssystemen geht es beim Befehl „ DELETE “ mehr um Kontrolle, Transparenz und Verantwortlichkeit als um die Syntax. In solchen Umgebungen geht's nicht nur darum, Daten zu löschen, sondern das sicher und bewusst zu machen.

Zugriffskontrolle und Berechtigungen

Im Arbeitsalltag sollte das Löschen von Daten nach dem Prinzip der geringsten Rechte gehen. Nicht jeder Benutzer oder jedes Anwendungsdienstkonto sollte über Berechtigungen für „ DELETE “ verfügen. 

Den meisten „Nur-Lese“-Benutzern oder Reporting-Tools sollte dieses Recht ausdrücklich verweigert werden. Die meisten Firmen brauchen normalerweise eine „Peer Review“, bei der jemand anderes die „ WHERE “-Klausel eines manuellen Löschskripts checkt, bevor es in der Produktion läuft.

Ich schlage vor, du probierst den Lernpfad „SQL Server für Datenbankadministratoren” aus, wenndu regelmäßig im Rahmen deiner Arbeit Datenbanken entwirfst oder wartest. 

Prüfung und vorläufiges Löschen

Viele Produktionssysteme vermeiden endgültige Löschungen wegen der damit verbundenen Risiken. Stattdessen nutzen sie Soft Deletes, bei denen eine Zeile als gelöscht markiert wird. Du kannst zum Beispiel einen Zeitstempel „ deleted_at “ oder ein Flag „ is_deleted “ verwenden, anstatt einen Datensatz physisch zu löschen.

Soft Deletes machen die Wiederherstellung einfach, helfen bei der Überwachung und speichern alte Daten für Fehlerbehebung und Compliance.

Fazit

Das Wichtigste ist: Definiere immer eine klare „ WHERE “-Klausel, schau dir die betroffenen Zeilen mit „ SELECT “ an und nutze Transaktionen, wann immer es geht. In Produktionssystemen sollte jede Löschung bewusst und nachprüfbar sein. Behandle „ DELETE ” genauso sorgfältig wie eine Schemaänderung oder eine Bereitstellung, dann bleibt es ein nützliches Tool und wird nicht zu einem teuren Fehler.

Ich empfehle dir, unserenKurs „Datenbankdesign“ zu machen. Da lernst du, wie man Datenbanken erstellt und verwaltet und das passende DBMS für deine Bedürfnisse auswählt. Ich empfehle dir auch, unserenLernpfad als Associate Data Engineer in SQL auszuprobieren,um die Grundlagen des Data Engineering und Data Warehousing zu lernen. 

Erhalte eine Top-SQL-Zertifizierung

Stelle deine SQL-Kenntnisse unter Beweis und bringe deine Datenkarriere voran.
Werde SQL-zertifiziert

Allan Ouko's photo
Author
Allan Ouko
LinkedIn
Ich verfasse Artikel, die Datenwissenschaft und Analytik vereinfachen und leicht verständlich und zugänglich machen.

Häufig gestellte Fragen zu SQL DELETE

Was ist der Unterschied zwischen DELETE und TRUNCATE oder DROP?

DELETE Entfernt ausgewählte Zeilen, TRUNCATE löscht schnell alle Zeilen und DROP löscht die Tabelle selbst.

Warum ist die WHERE-Klausel in DELETE so wichtig?

Ohne die Klausel „ WHERE “ löscht „ DELETE “ alle Zeilen, was zu einem kompletten Datenverlust führen kann.

Warum klappen manche DELETE-Operationen nicht?

Fremdschlüsselbeschränkungen verhindern das Löschen, wenn abhängige untergeordnete Zeilen ohne Kaskadenregeln vorhanden sind.

Wie kann ich sicher sehen, was gelöscht wird?

Benutze eine Anweisung „ SELECT “ mit derselben Bedingung „ WHERE “, um die betroffenen Zeilen vor dem Löschen zu überprüfen.

Wie kann ich große Datensätze sicher löschen?

Benutze die Batch-Löschfunktion, um Zeilen in Blöcken zu entfernen, damit du langwierige Transaktionen und Performance-Probleme vermeidest.

Themen

Lerne SQL mit DataCamp

Kurs

Datenbearbeitung in SQL

4 Std.
303.1K
Lerne, mit komplexen SQL-Abfragen diverse Data-Science-Aufgaben zu lösen und Datensätze für Analysen in PostgreSQL vorzubereiten.
Details anzeigenRight Arrow
Kurs starten
Mehr anzeigenRight Arrow