Порядок обновления такой
- Мы вводим команду UPDATE
- После команды UPDATE мы делаем объединение таблиц
- После этого мы пишем команду SET и пишем какие столбцы мы хотим обновить.
Получается, что после UPDATE будет объединенная таблица.
А строки объединенной таблицы будут условием обновления объединенных таблиц.
Т.е. в обновляемых таблицах обновятся только те строки, которые есть в объединенной таблице.
Мы получаем внутри UPDATE используя INNER JOIN и ON выборку данных, состоящую из строк.
Те столбцы, которые обновляются в SET обновятся не для всей таблицы, а только для тех строк, которые попали в выборку.
Другими словами, в исходных таблицах будут обновлены только те строки, которые удовлетворяют условиям объединения. Обновятся только те строки исходных таблиц, ключевые поля которых попадают в объединенную таблицу.
Те строки, исходных таблиц, которые не попали в объединенную таблицу, не будут обновлены.
После оператора UPDATE мы как бы говорим обновить это. А после оператора SET пишем, что именно мы обновляем.
Задание
Задача взята из курса «Интерактивный тренажер по SQL«, ссылка на модуль с задачей. На мой взгляд это один из лучших технических курсов. В нём минимум теории, много примеров и задач.
Для книг, которые уже есть на складе (в таблице book), но по другой цене, чем в поставке (supply), необходимо в таблице book увеличить количество на значение, указанное в поставке, и пересчитать цену. А в таблице supply обнулить количество этих книг. Формула для пересчета цены:
где p1, p2 — цена книги в таблицах book
и supply;
k1, k2 — количество книг в таблицах book
и supply.
Запрос
UPDATE book
INNER JOIN author ON author.author_id = book.author_id
INNER JOIN supply ON book.title = supply.title
and supply.author = author.name_author and book.price <> supply.price
SET
book.amount = book.amount + supply.amount,
book.price = (book.price * book.amount + supply.price * supply.amount) / (book.amount + supply.amount),
supply.amount = 0
Результат: