CodeRang
Темы SQL

UPDATE SQL: INSERT, UPDATE и DELETE данных

UPDATE SQL изменяет существующие строки таблицы по заданному условию. Рядом с ним разберём INSERT SQL для добавления строк и DELETE SQL для их удаления.

Обновлено · Команда SQL Arena

Что потренируете

  • Добавлять данные через INSERT и INSERT SELECT
  • Обновлять строки через UPDATE FROM
  • Удалять строки с условиями и подзапросами
  • Возвращать изменённые данные через RETURNING
  • Использовать ON CONFLICT для upsert

Пример задачи в тренажёре

Так выглядит задача в SQL Arena: условие, редактор, результат и схема базы.

Пред.След.Случайная
ЗаданиеОтправкиAI Mentor
Примените поставку к остаткам товаров

В inventory_adjustments записаны изменения остатков. Примените только строки с reason = 'delivery': увеличьте products.stock_qty на соответствующий delta_qty. Верните изменённые sku и stock_qty, отсортированные по sku.

Запрос 1PostgreSQLv16
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;
Отправить
Результатproductsinventory_adjustments
Ответ принят

Как работает 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, оператор может сразу вернуть добавленные, обновлённые или удалённые строки.

SQLPostgreSQL v16
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;
Результат запроса
skustock_qty
CB-51040
KB-10120
MS-22028
ST-41015

Ошибки в INSERT, UPDATE и DELETE SQL

01

UPDATE FROM создаёт несколько совпадений для одной строки

Если для одного product_id найдётся несколько подходящих строк inventory_adjustments, нельзя бездумно рассчитывать, что UPDATE последовательно сложит все значения. Сначала агрегируйте изменения до одной строки на товар, если бизнес-условие допускает несколько записей.

02

Запуск UPDATE или DELETE без предварительной проверки

Слишком широкое WHERE может изменить или удалить больше данных, чем планировалось. Сначала выполните SELECT с теми же соединениями и фильтрами, посмотрите набор строк и только после этого превращайте запрос в UPDATE или DELETE.

03

Путать 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 есть отдельная песочница.

Справочник по теме

Подробные статьи с синтаксисом и примерами в справочнике 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