Погугливши, здається, популярною відповіддю є "просто вимкнути безпечний режим" :
SET SQL_SAFE_UPDATES = 0;
DELETE FROM instructor WHERE salary BETWEEN 13000 AND 15000;
SET SQL_SAFE_UPDATES = 1;
Якщо чесно, я не можу сказати, що коли-небудь звик бігати в безпечному режимі. Тим не менше, мені не зовсім приємно з цією відповіддю, оскільки вона просто передбачає, що вам слід піти змінювати конфігурацію бази даних кожного разу, коли ви зіткнетеся з проблемою.
Отже, ваш другий запит знаходиться ближче до позначки, але вражає іншу проблему: MySQL застосовує кілька обмежень до підзапитів, і одне з них полягає в тому, що ви не можете змінити таблицю, вибираючи з неї у підзапиті.
Посилання з посібника MySQL, Обмеження на підзапити :
Загалом, ви не можете змінювати таблицю та вибирати з тієї самої таблиці в підзапиті. Наприклад, це обмеження стосується тверджень таких форм:
DELETE FROM t WHERE ... (SELECT ... FROM t ...);
UPDATE t ... WHERE col = (SELECT ... FROM t ...);
{INSERT|REPLACE} INTO t (SELECT ... FROM t ...);
Виняток: Попередня заборона не застосовується, якщо ви використовуєте підзапит для модифікованої таблиці в реченні FROM. Приклад:
UPDATE t ... WHERE col = (SELECT * FROM (SELECT ... FROM t...) AS _t ...);
Тут результат підзапиту в реченні FROM зберігається як тимчасова таблиця, тому відповідні рядки у t вже були вибрані на момент оновлення до t.
Цей останній біт - ваша відповідь. Виберіть цільові ідентифікатори у тимчасовій таблиці, а потім видаліть, посилаючись на ідентифікатори в цій таблиці:
DELETE FROM instructor WHERE id IN (
SELECT temp.id FROM (
SELECT id FROM instructor WHERE salary BETWEEN 13000 AND 15000
) AS temp
);
Демонстрація SQLFiddle .