Syntax für eine Tabelle:
DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROMtbl_name[WHEREwhere_condition] [ORDER BY ...] [LIMITrow_count]
Syntax für mehrere Tabellen:
DELETE [LOW_PRIORITY] [QUICK] [IGNORE]
    tbl_name[.*] [, tbl_name[.*]] ...
    FROM table_references
    [WHERE where_condition]
Oder:
DELETE [LOW_PRIORITY] [QUICK] [IGNORE]
    FROM tbl_name[.*] [, tbl_name[.*]] ...
    USING table_references
    [WHERE where_condition]
        Bei der Ein-Tabellen-Syntax löscht die
        DELETE-Anweisung Datensätze aus
        tbl_name und gibt die Anzahl
        gelöschter Datensätze zurück. Sofern angegeben, bestimmt die
        WHERE-Klausel die Bedingungen dafür, welche
        Datensätze gelöscht werden. Ohne
        WHERE-Klausel werden alle Datensätze
        gelöscht. Wenn die ORDER BY-Klausel
        vorhanden ist, werden die Datensätze in der angegebenen
        Reihenfolge gelöscht. Die LIMIT-Klausel kann
        die Anzahl der zu löschenden Datensätze beschränken.
      
        Bei der Mehrtabellensyntax löscht DELETE aus
        jeder Tabelle tbl_name die
        Datensätze, die die Bedingungen erfüllen. In diesem Fall
        können ORDER BY und LIMIT
        nicht verwendet werden.
      
        where_condition ist ein Ausdruck, der
        für jeden zu löschenden Datensatz wahr ist. Er wird wie in
        Abschnitt 13.2.7, „SELECT“, beschrieben angegeben.
      
        Wie bereits gesagt, löscht eine
        DELETE-Anweisung ohne
        WHERE-Klausel alle Datensätze. Wenn Sie die
        Anzahl der gelöschten Datensätze nicht kennen müssen, können
        Sie dies schneller mit TRUNCATE TABLE
        erledigen. Siehe auch Abschnitt 13.2.9, „TRUNCATE“.
      
        Wenn Sie den Datensatz entfernen, der den höchsten Wert für
        eine AUTO_INCREMENT-Spalte hat, dann wird der
        Wert bei BDB-Tabellen später
        wiederverwendet, nicht jedoch bei MyISAM-
        oder InnoDB-Tabellen. Wenn Sie im
        AUTOCOMMIT-Modus alle Datensätze in der
        Tabelle mit DELETE FROM
         (ohne
        tbl_nameWHERE-Klausel) löschen, beginnt die Sequenz
        für alle Speicher-Engines mit Ausnahme von
        InnoDB und MyISAM neu. Bei
        InnoDB-Tabellen gibt es bezüglich dieses
        Verhaltens ein paar Ausnahmen, die in
        Abschnitt 14.2.6.3, „Wie eine Auto-Increment-Spalte in InnoDB funktioniert“, beschrieben
        sind.
      
        Bei MyISAM- und
        BDB-Tabellen können Sie
        AUTO_INCREMENT in einer Sekundärspalte eines
        mehrspaltigen Schlüssels angeben. In diesem Fall werden Werte,
        die am Anfang der Sequenz gelöscht wurden, auch bei
        MyISAM-Tabellen wiederverwendet. Siehe auch
        Abschnitt 3.6.9, „Verwendung von AUTO_INCREMENT“.
      
        Die DELETE-Anweisung unterstützt die
        folgenden Modifizierer:
      
            Wenn Sie LOW_PRIORITY angeben, verzögert
            der Server die Ausführung von DELETE,
            bis kein Client mehr aus der Tabelle liest.
          
            Wenn Sie bei MyISAM-Tabellen das
            Schlüsselwort QUICK angeben, fasst die
            Speicher-Engine beim Löschen Indexzweige nicht zusammen.
            Dies kann bestimmte Arten von Löschvorgängen
            beschleunigen.
          
            Das Schlüsselwort IGNORE bewirkt, dass
            MySQL alle Fehler während des Vorgangs der
            Datensatzlöschung ignoriert. (Fehler, die bei der Analyse
            auftreten, werden allerdings wie gewöhnlich verarbeitet.)
            Fehler, die aufgrund der Verwendung von
            OPTION ignoriert werden, werden als
            Warnungen zurückgegeben.
          
        Die Geschwindigkeit von Löschoperationen kann auch von den
        Faktoren beeinflusst werden, die in
        Abschnitt 7.2.18, „Geschwindigkeit von DELETE-Anfragen“, beschrieben werden.
      
        Bei MyISAM-Tabellen werden gelöschte
        Datensätze zu einer verknüpften Liste hinzugefügt.
        Nachfolgende INSERT-Operationen verwenden die
        alten Datensatzpositionen neu. Um ungenutzten Speicher wieder
        freizugeben und die Dateigrößen zu verringern, verwenden Sie
        die OPTIMIZE TABLE-Anweisung oder das
        Hilfsprogramm myisamchk zur Reorganisierung
        der Tabellen. OPTIMIZE TABLE ist einfacher,
        myisamchk hingegen schneller. Siehe auch
        Abschnitt 13.5.2.5, „OPTIMIZE TABLE“, und
        Abschnitt 8.2, „myisamchk — Hilfsprogramm für die Tabellenwartung von MyISAM“.
      
        Der Modifizierer QUICK bestimmt, ob
        Indexzweige bei Löschoperationen zusammengefasst werden.
        DELETE QUICK ist am nützlichsten bei
        Anwendungen, bei denen Indexwerte für gelöschte Datensätze
        durch ähnliche Indexwerte von später eingefügten Datensätzen
        ersetzt werden. In diesem Fall werden die von den gelöschten
        Werten zurückgelassenen Löcher wiederverwendet.
      
        DELETE QUICK ist hingegen nicht nützlich,
        wenn gelöschte Werte nicht aufgefüllte Indexblöcke zur Folge
        haben, die einen Bereich von Indexwerten umfassen, bei denen
        neue Einfügeoperationen auftreten. In diesem Fall kann die
        Verwendung von QUICK zur Verschwendung von
        Speicher im Index führen, da dieser Speicher nicht mehr
        freigegeben wird. Hier ein Beispiel für ein solches Szenario:
      
            Erstellen Sie eine Tabelle, die eine indizierte
            AUTO_INCREMENT-Spalte enthält.
          
Fügen Sie viele Datensätze in diese Tabelle ein. Jede Einfügeoperation führt dazu, dass ein Indexwert am Ende des Indexes eingefügt wird.
            Löschen Sie mit DELETE QUICK einen Block
            mit Datensätzen vorne im Spaltenbereich.
          
        In diesem Szenario werden die Indexblöcke, die mit den
        gelöschten Indexwerten verknüpft sind, nicht aufgefüllt, aber
        aufgrund der Verwendung von QUICK auch nicht
        mit anderen Indexblöcken zusammengefasst. Sie bleiben also
        unaufgefüllt, wenn weitere Einfügeoperationen auftreten, weil
        die neuen Datensätze keine Indexwerte im gelöschten Bereich
        haben. Außerdem bleiben sie auch dann unaufgefüllt, wenn Sie
        später DELETE ohne QUICK
        verwenden, sofern nicht zufällig einige der gelöschten
        Indexwerte in Indexblöcken innerhalb oder neben den nicht
        aufgefüllten Blöcken liegen. Um ungenutzten Indexspeicher
        unter diesen Umständen wieder freizugeben, verwenden Sie
        OPTIMIZE TABLE.
      
        Wenn Sie viele Datensätze aus einer Tabelle zu löschen
        beabsichtigen, kann DELETE QUICK gefolgt von
        OPTIMIZE TABLE die schnellere Lösung sein.
        Hierbei wird der Index neu erstellt, statt zahlreiche
        Zusammenfassungsoperationen für Indexblöcke auszuführen.
      
        Die MySQL-spezifische Option LIMIT
         für
        row_countDELETE nennt dem Server die maximale Anzahl
        Datensätze, die gelöscht werden, bevor die Kontrolle an den
        Client zurückgegeben wird. Hiermit können Sie gewährleisten,
        dass eine gegebene DELETE-Anweisung nicht zu
        viel Zeit in Anspruch nimmt. Sie können die
        DELETE-Anweisung dann einfach wiederholen,
        bis die Gesamtzahl betroffener Datensätze kleiner ist als der
        LIMIT-Wert.
      
        Wenn die DELETE-Anweisung eine ORDER
        BY-Klausel enthält, werden die Datensätze in der in
        der Klausel angegebenen Reihenfolge gelöscht. Dies ist nur in
        Verbindung mit LIMIT wirklich nützlich. Die
        folgende Anweisung beispielsweise findet Datensätze, die der
        WHERE-Klausel entsprechen, sortiert sie nach
        timestamp_column und löscht den ersten
        (d. h. ältesten) Datensatz:
      
DELETE FROM somelog WHERE user = 'jcole' ORDER BY timestamp_column LIMIT 1;
        Sie können in einer DELETE-Anweisung mehrere
        Tabellen angeben, aus denen je nach Bedingung der
        WHERE-Klausel Datensätze gelöscht werden.
        Allerdings können Sie ORDER BY oder
        LIMIT nicht in einer
        DELETE-Anweisung für mehrere Tabellen
        verwenden. Die Klausel
        table_references listet die Tabellen
        auf, die im Join berücksichtigt werden. Die Syntax ist in
        Abschnitt 13.2.7.1, „JOIN“, beschrieben.
      
        Bei der ersten Mehrtabellensyntax werden nur passende
        Datensätze aus den Tabellen gelöscht, die vor der
        FROM-Klausel aufgelistet sind. Bei der
        zweiten Mehrtabellensyntax werden nur passende Datensätze aus
        den Tabellen gelöscht, die in der
        FROM-Klausel (vor der
        USING-Klausel) aufgelistet sind. Die Folge
        ist, dass Sie Datensätze aus vielen Tabellen gleichzeitig
        löschen und gleichzeitig in weiteren Tabellen nur suchen lassen
        können:
      
DELETE t1, t2 FROM t1, t2, t3 WHERE t1.id=t2.id AND t2.id=t3.id;
Oder:
DELETE FROM t1, t2 USING t1, t2, t3 WHERE t1.id=t2.id AND t2.id=t3.id;
        Diese Anweisungen verwenden auf der Suche nach zu löschenden
        Datensätzen alle drei Tabellen, aber gelöscht werden passende
        Datensätze tatsächlich nur aus den Tabellen
        t1 und t2.
      
        Die obigen Beispiele zeigen innere Joins, die den Kommaoperator
        verwenden. DELETE-Anweisungen für mehrere
        Tabellen können jedoch einen beliebigen Join-Typ verwenden, der
        für SELECT-Anweisungen zulässig ist, also
        etwa LEFT JOIN.
      
        Die Syntax erlaubt .* nach den Tabellennamen,
        um die Kompatibilität mit Access zu gewährleisten.
      
        Wenn Sie eine DELETE-Anweisung für mehrere
        Tabellen verwenden, die auch InnoDB-Tabellen
        einbezieht, für die Fremdschlüssel-Constraints vorhanden sind,
        dann verarbeitet der MySQL-Optimierer die Tabellen unter
        Umständen in einer Reihenfolge, die sich von der ihrer
        Parent/Child-Beziehung unterscheidet. In diesem Fall schlägt
        die Anweisung fehl, und es wird ein Rollback durchgeführt.
        Stattdessen sollten Sie die Löschoperation dann aus nur einer
        Tabelle durchführen und sich auf die ON
        DELETE-Funktionalität verlassen, die
        InnoDB bietet, um andere Tabellen
        entsprechend zu ändern.
      
Hinweis: Wenn Sie einen Alias für eine Tabelle angegeben haben, müssen Sie diesen bei der Referenzierung der Tabelle verwenden:
DELETE t1 FROM test AS t1, test2 WHERE ...
Datenbankübergreifende Löschvorgänge werden von Löschvorgängen für mehrere Tabellen unterstützt. In diesem Fall müssen Sie die Tabellen aber ohne Verwendung von Aliasen referenzieren. Zum Beispiel:
DELETE test1.tmp1, test2.tmp2 FROM test1.tmp1, test2.tmp2 WHERE ...
Zurzeit können Sie in einer Unterabfrage keine Löschoperation in einer Tabelle durchführen und gleichzeitig eine Auswahl in einer anderen Tabelle treffen.
Dies ist eine Übersetzung des MySQL-Referenzhandbuchs, das sich auf dev.mysql.com befindet. Das ursprüngliche Referenzhandbuch ist auf Englisch, und diese Übersetzung ist nicht notwendigerweise so aktuell wie die englische Ausgabe. Das vorliegende deutschsprachige Handbuch behandelt MySQL bis zur Version 5.1.

