Урок 8.3: Оператор DELETE
В предыдущем уроке мы научились изменять записи с помощью UPDATE. Теперь рассмотрим, как удалять ненужные или устаревшие строки с помощью оператора DELETE. Это важная DML-команда, которую нужно применять особенно аккуратно, потому что удалённые данные не всегда можно легко восстановить.
Базовый синтаксис
DELETE FROM table_name
WHERE condition;
DELETE FROM table_name— указывает таблицу, из которой нужно удалить строки.WHERE condition— определяет, какие именно строки будут удалены.
Если WHERE не указан, будут удалены все строки таблицы.
Важные правила
- Всегда проверяйте условие
WHERE: ошибка в условии может удалить не те данные или слишком много строк. - Сначала делайте
SELECT: передDELETEполезно выполнитьSELECTс тем же условием и убедиться, что выборка верная. - Структура таблицы сохраняется:
DELETEудаляет только данные, но не саму таблицу и не её столбцы. - Связанные данные: если в таблице настроены внешние ключи, база данных может запретить удаление строк, на которые ссылаются другие таблицы.
- Транзакции: в рабочих системах безопаснее выполнять важные удаления внутри транзакции.
Примеры
Пример 1: Удаление одной строки
Удалим одного покупателя по его идентификатору:
DELETE FROM customer
WHERE customer_id = 1;
Примечание: благодаря WHERE customer_id = 1 будет удалена только одна конкретная запись.
Пример 2: Удаление нескольких строк по условию
Удалим записи оплат, сделанные до определённой даты:
DELETE FROM payment
WHERE payment_date < '2005-05-25';
Результат: будут удалены все строки из payment, у которых дата платежа меньше указанной.
Пример 3: Удаление с подзапросом
Иногда нужно удалить строки, связанные с условием из другой таблицы. Например, удалим платежи неактивных покупателей:
DELETE FROM payment
WHERE customer_id IN (
SELECT customer_id
FROM customer
WHERE active = 0
);
Результат: будут удалены платежи всех покупателей, помеченных как неактивные.
Пример 4: Удаление всех строк из таблицы
Если нужно полностью очистить таблицу, DELETE можно использовать и без WHERE:
DELETE FROM temp_import;
Примечание: таблица temp_import останется существовать, но все её строки будут удалены.
Проверка перед удалением
Хорошая практика — сначала посмотреть, какие строки попадут под удаление:
-- Сначала проверяем строки
SELECT customer_id, first_name, last_name, active
FROM customer
WHERE active = 0;
-- Только после проверки выполняем DELETE
DELETE FROM customer
WHERE active = 0;
Такой подход помогает избежать случайного удаления лишних данных.
Когда DELETE особенно полезен
- очистка временных или тестовых данных;
- удаление устаревших записей по дате;
- удаление строк, которые больше не соответствуют бизнес-правилам;
- подготовка таблиц к повторной загрузке данных.
Ключевые выводы этого урока:
DELETEудаляет существующие строки из таблицы.- Без
WHEREбудут удалены все строки таблицы. - Перед удалением желательно выполнить
SELECTс тем же условием. DELETEсохраняет структуру таблицы — удаляются только данные.- В важных сценариях безопаснее использовать транзакции и учитывать внешние ключи.