SQL DELETE
DELETE в SQL: удаление строк с условием WHERE, удаление всех строк и отличие от TRUNCATE — с самодостаточными примерами.
DELETE FROM удаляет строки из таблицы. Без
WHERE— все строки. Структура таблицы при этом остаётся нетронутой.
Синтаксис
DELETE FROM имя_таблицы WHERE условие;
Предупреждение. Если пропустить
WHERE, удалятся все строки таблицы без возможности восстановления. Всегда проверяйте условие заранее черезSELECTс тем жеWHERE.
Пример 1: удаление строк по условию
Удалим из таблицы persons строки, где id > 3, и проверим результат:
DELETE FROM persons WHERE id > 3;
SELECT * FROM persons;
Результат:
+----+-------------------+------------+-------------+ | id | name | birth_date | phone | +----+-------------------+------------+-------------+ | 1 | Peter Wilson | 1990-07-15 | 0711-020361 | | 2 | Carrie Simpson | 1995-05-01 | 0251-031259 | | 3 | Victoria Ashworth | 1996-10-17 | 0695-346721 | +----+-------------------+------------+-------------+
Пример 2: удаление по строковому условию
-- Сначала проверяем, кого удалим — хорошая практика перед DELETE
SELECT * FROM customers WHERE city = 'Madrid';
-- Убеждаемся, что это именно те строки, — только потом удаляем
DELETE FROM customers WHERE city = 'Madrid';
Результат SELECT перед удалением:
+---------+--------------------+--------+-------------+ | cust_id | cust_name | city | postal_code | +---------+--------------------+--------+-------------+ | 2 | Fran Wilson | Madrid | 28023 | | 6 | Christina Aguilera | Madrid | 28001 | +---------+--------------------+--------+-------------+
Пример 3: удаление всех строк (без WHERE)
-- Создадим временную таблицу, чтобы не повредить основную
CREATE TABLE temp_persons AS SELECT * FROM persons;
DELETE FROM temp_persons; -- удаляет ВСЕ строки
SELECT COUNT(*) AS remaining FROM temp_persons;
Результат:
+-----------+ | remaining | +-----------+ | 0 | +-----------+
DELETE vs TRUNCATE — быстрое сравнение
Критерий | DELETE | TRUNCATE |
Условие WHERE | Поддерживается | Нет |
Скорость на больших таблицах | Медленнее (построчно) | Быстрее |
Сброс AUTO_INCREMENT | Нет | Да |
Откат (ROLLBACK) | Поддерживается в транзакции | Зависит от СУБД |
Коротко
DELETE FROM таблица WHERE условие— удаляет только строки, удовлетворяющие условию.- Без
WHERE— удаляются все строки, структура таблицы остаётся. - Перед удалением выполните
SELECTс тем жеWHERE, чтобы убедиться в правильности условия. - Если нужно стереть все строки быстро — используйте
TRUNCATE TABLE.
Проверьте себя
1. Что произойдёт с таблицей persons после выполнения DELETE FROM persons (без WHERE)?
AТаблица будет полностью удалена из базы данных вместе со структурой
BВсе данные из таблицы будут удалены, но структура таблицы сохранится
CУдалится только последняя добавленная строка
DЗапрос вернёт ошибку — WHERE обязателен
2. Какой запрос удалит из таблицы persons все записи, где id больше 3?
AREMOVE FROM persons WHERE id > 3;
BDELETE FROM persons WHERE id > 3;
CDELETE persons WHERE id > 3;
DDROP FROM persons WHERE id > 3;
3. После DELETE FROM persons WHERE id > 3 таблица содержала 5 строк с id 1-5. Сколько строк останется?
A0 строк
B2 строки (id = 4 и id = 5)
C4 строки (id = 1, 2, 3, 4)
D3 строки (id = 1, 2, 3)
4. Чем DELETE FROM table отличается от DROP TABLE table?
ADELETE удаляет строки данных, структура таблицы остаётся; DROP удаляет таблицу целиком вместе со структурой
BНичем — оба оператора удаляют таблицу полностью
CDELETE работает быстрее, чем DROP
DDROP можно откатить транзакцией, DELETE — нет