SQL код скопирован в буфер обмена
EN PT FR

Урок 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 сохраняет структуру таблицы — удаляются только данные.
  • В важных сценариях безопаснее использовать транзакции и учитывать внешние ключи.