Cercando su Google, la risposta popolare sembra essere "disattiva la modalità provvisoria" :
SET SQL_SAFE_UPDATES = 0;
DELETE FROM instructor WHERE salary BETWEEN 13000 AND 15000;
SET SQL_SAFE_UPDATES = 1;
Se devo essere sincero, non posso dire di aver mai preso l'abitudine di correre in modalità provvisoria. Tuttavia, non sono del tutto a mio agio con questa risposta poiché presume che dovresti cambiare la configurazione del tuo database ogni volta che incontri un problema.
Quindi, la tua seconda query è più vicina al segno, ma incontra un altro problema: MySQL applica alcune restrizioni alle sottoquery e una di queste è che non puoi modificare una tabella mentre selezioni da essa in una sottoquery.
Citando dal manuale MySQL, Restrizioni sulle sottoquery :
In generale, non è possibile modificare una tabella e selezionare dalla stessa tabella in una sottoquery. Ad esempio, questa limitazione si applica alle dichiarazioni delle seguenti forme:
DELETE FROM t WHERE ... (SELECT ... FROM t ...);
UPDATE t ... WHERE col = (SELECT ... FROM t ...);
{INSERT|REPLACE} INTO t (SELECT ... FROM t ...);
Eccezione: il divieto precedente non si applica se si utilizza una sottoquery per la tabella modificata nella clausola FROM. Esempio:
UPDATE t ... WHERE col = (SELECT * FROM (SELECT ... FROM t...) AS _t ...);
Qui il risultato della sottoquery nella clausola FROM viene memorizzato come una tabella temporanea, quindi le righe pertinenti in t sono già state selezionate nel momento in cui ha luogo l'aggiornamento a t.
Quest'ultimo pezzo è la tua risposta. Seleziona gli ID di destinazione in una tabella temporanea, quindi elimina facendo riferimento agli ID in quella tabella:
DELETE FROM instructor WHERE id IN (
SELECT temp.id FROM (
SELECT id FROM instructor WHERE salary BETWEEN 13000 AND 15000
) AS temp
);
Demo di SQLFiddle .