UPDATE SQL: INSERT, UPDATE и DELETE данных
UPDATE SQL изменяет существующие строки таблицы по заданному условию. Рядом с ним разберём INSERT SQL для добавления строк и DELETE SQL для их удаления.
Обновлено · Команда SQL Arena
Что потренируете
- Добавлять данные через INSERT и INSERT SELECT
- Обновлять строки через UPDATE FROM
- Удалять строки с условиями и подзапросами
- Возвращать изменённые данные через RETURNING
- Использовать ON CONFLICT для upsert
Пример задачи в тренажёре
Так выглядит задача в SQL Arena: условие, редактор, результат и схема базы.
В inventory_adjustments записаны изменения остатков. Примените только строки с reason = 'delivery': увеличьте products.stock_qty на соответствующий delta_qty. Верните изменённые sku и stock_qty, отсортированные по sku.
WITH updated AS ( UPDATE products AS p SET stock_qty = p.stock_qty + a.delta_qty FROM inventory_adjustments AS a WHERE a.product_id = p.id AND a.reason = 'delivery' RETURNING p.sku, p.stock_qty ) SELECT sku, stock_qty FROM updated ORDER BY sku;
| # | sku | stock_qty |
|---|---|---|
| 1 | CB-510 | 40 |
| 2 | KB-101 | 20 |
| 3 | MS-220 | 28 |
| 4 | ST-410 | 15 |
В inventory_adjustments записаны изменения остатков. Примените только строки с reason = 'delivery': увеличьте products.stock_qty на соответствующий delta_qty. Верните изменённые sku и stock_qty, отсортированные по sku.
WITH updated AS ( UPDATE products AS p SET stock_qty = p.stock_qty + a.delta_qty FROM inventory_adjustments AS a WHERE a.product_id = p.id AND a.reason = 'delivery' RETURNING p.sku, p.stock_qty ) SELECT sku, stock_qty FROM updated ORDER BY sku;
Как работает UPDATE SQL и другие DML-запросы
UPDATE изменяет таблицу products, но величина изменения хранится в другой таблице. Поэтому после SET используется FROM inventory_adjustments. Условие a.product_id = p.id связывает запись поставки с нужным товаром, а дополнительный фильтр a.reason = 'delivery' не даёт применить списание из-за damage или audit. В SET старый остаток складывается с delta_qty.
RETURNING выполняется как часть UPDATE и сразу отдаёт значения изменённых строк. Это удобно для проверки результата операции и для прикладного кода, которому после изменения нужны id, статус, новый остаток или другие поля. В примере UPDATE помещён в CTE updated, потому что обычный RETURNING не предназначен для сортировки результата через ORDER BY. Внешний SELECT получает возвращённые строки и задаёт стабильный порядок по sku.
Перед изменяющим запросом полезно выполнить SELECT с теми же FROM и WHERE. Для этой задачи можно сначала выбрать p.sku, p.stock_qty, a.delta_qty и убедиться, что в выборке только четыре поставки. Такой приём особенно важен перед массовыми UPDATE и DELETE: ошибка в условии чтения безопасна, а та же ошибка в изменяющем запросе может затронуть лишние строки.
UPDATE изменяет существующие строки, INSERT добавляет новые, а DELETE удаляет строки из таблицы. Для UPDATE и DELETE особенно важен WHERE: без него операция затронет все подходящие строки таблицы. Добавить строку в таблицу SQL обычно позволяет конструкция INSERT INTO с явным списком колонок и VALUES. При массовых изменениях полезно сначала выполнить SELECT с тем же условием и проверить набор данных. Если СУБД поддерживает RETURNING, оператор может сразу вернуть добавленные, обновлённые или удалённые строки.
WITH updated AS ( UPDATE products AS p SET stock_qty = p.stock_qty + a.delta_qty FROM inventory_adjustments AS a WHERE a.product_id = p.id AND a.reason = 'delivery' RETURNING p.sku, p.stock_qty ) SELECT sku, stock_qty FROM updated ORDER BY sku;
| sku | stock_qty |
|---|---|
| CB-510 | 40 |
| KB-101 | 20 |
| MS-220 | 28 |
| ST-410 | 15 |
Ошибки в INSERT, UPDATE и DELETE SQL
UPDATE FROM создаёт несколько совпадений для одной строки
Если для одного product_id найдётся несколько подходящих строк inventory_adjustments, нельзя бездумно рассчитывать, что UPDATE последовательно сложит все значения. Сначала агрегируйте изменения до одной строки на товар, если бизнес-условие допускает несколько записей.
Запуск UPDATE или DELETE без предварительной проверки
Слишком широкое WHERE может изменить или удалить больше данных, чем планировалось. Сначала выполните SELECT с теми же соединениями и фильтрами, посмотрите набор строк и только после этого превращайте запрос в UPDATE или DELETE.
Путать INSERT с upsert
Обычный INSERT завершится ошибкой при конфликте с уникальным ключом. Если по правилу существующую запись нужно обновить, в PostgreSQL используют INSERT ... ON CONFLICT ... DO UPDATE. Условия конфликта и обновляемые поля должны соответствовать реальной логике данных.
Задачи по теме в тренажёре
Трек «SQL для Backend-разработчика»DML лучше тренировать не отдельными синтаксическими конструкциями, а сценариями. Сначала добавьте одну строку, затем вставьте пачку через INSERT ... SELECT, обновите связанные записи через UPDATE ... FROM, удалите строки на основе подзапроса и обработайте конфликт ключа через ON CONFLICT. В SQL Arena есть бесплатные Easy-задачи на добавление тестового пользователя, создание набора заказов и изменение отдельной записи, а дальше встречаются пересчёт итогов после импорта, массовое удаление и приём поставки с upsert. Для продолжения подойдёт трек «SQL для Backend-разработчика». Все запросы выполняются в браузере; для PostgreSQL есть отдельная песочница.
- EasyбесплатноДобавить тестового пользователя в баг-трекерpostgresqlmysql
- EasyбесплатноЗасидить тестовые заказы с разными статусамиpostgresqlmysql
- EasyбесплатноДобавить первую заметку в дневникpostgresql
- EasyбесплатноЗакрепить заметку по idpostgresql
- MediumPremiumПредставление для проверенных пассажировpostgresqlmysql
- HardPremiumУдалить группы с минимальным числом туровpostgresqlmysql
- MediumPremiumПересчитать total_spent после импорта заказовpostgresql
- HardPremiumПринять поставку с добавлением новых товаровpostgresql
Справочник по теме
Подробные статьи с синтаксисом и примерами в справочнике SQL Arena.
Частые вопросы
Как работает UPDATE SQL?
UPDATE изменяет значения в существующих строках таблицы. В SET указывают новые значения, а WHERE определяет, какие строки нужно обновить; без WHERE запрос обычно затронет все строки таблицы.
Как работает INSERT SQL?
INSERT добавляет новые строки в таблицу. Обычно используют INSERT INTO с перечислением колонок и VALUES со значениями, которые нужно записать.
Как работает DELETE SQL?
DELETE удаляет строки из таблицы, соответствующие условию WHERE. Если выполнить DELETE без WHERE, будут удалены все строки, поэтому условие необходимо проверять особенно внимательно.
Как удалить строку SQL?
Используйте DELETE FROM с условием WHERE, которое однозначно выбирает нужную строку или набор строк. Перед удалением полезно выполнить SELECT с тем же WHERE и убедиться, что фильтр выбирает именно нужные данные.
Как добавить строку в таблицу SQL?
Для добавления строки используют INSERT INTO. Лучше явно перечислять целевые колонки, чтобы запрос не зависел от физического порядка столбцов в таблице.
Практика INSERT, UPDATE и DELETE SQL
В SQL Arena запрос запускается на отдельном датасете задачи и автоматически проверяется. Всего доступно 1 192 задачи. Бесплатный тариф без карты включает 292 задачи на PostgreSQL, MySQL, ClickHouse и BigQuery; более сложные сценарии доступны в Premium.
Перейти к задачам SQL