Погуглив, популярный ответ, кажется, "просто выключи безопасный режим" :
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 .