1. Оператор UPDATE SET
Якщо потрібно змінити існуючі записи в таблиці, використовуємо оператор UPDATE
.
З одного боку, оператор UPDATE
схожий на оператор INSERT
, адже нам потрібно вказувати нові значення для колонок. А з іншого — на оператор SELECT
, адже він дозволяє працювати одразу з групами даних.
Важливо! Мета оператора UPDATE
— змінити дані не в одному рядку таблиці, а в усіх рядках, які відповідають певній умові. І якщо зробити маленьку помилку, легко можна втратити всі дані у таблиці.
Загальний запит:
UPDATE таблиця SET
колонка1 = вираз1,
колонка2 = вираз2,
колонка3 = вираз3
WHERE умова;
Давай напишемо запит, який збільшить зарплату всіх наших співробітників на 100. Виглядати наш запит буде так:
UPDATE employee SET
salary = salary+100;
А тепер усім, у кого зарплата менша за 50К, ще й збільшимо її на 20%. Приклад запиту:
UPDATE employee SET
salary = salary*1.2
WHERE salary<50000;
Ну і звісно ж збільшимо зарплату директору в 2 рази, як без нього:
UPDATE employee SET
salary = salary*2
WHERE id=4;
2. Складні сценарії змінення даних
Якщо ти вирішиш змінити дані в декількох таблицях одночасно, або під час зміни даних в одній таблиці потрібно заповнити її даними з іншої, або просто якимось чином задіяти дані з іншої таблиці в процесі зміни першої, то тут на нас чекають сюрпризи.
Давай спробуємо змінити рівень всіх користувачів у таблиці user, які існують у таблиці employee. Збіг користувачів для простоти перевірятимемо на ім'я.
Як би ми хотіли написати цей запит:
UPDATE user SET
level = 80,
WHERE user.name IN (список імен з таблиці employee);
Ну і додамо до цього запиту список імен з таблиці employee:
UPDATE user SET
level = 80,
WHERE user.name IN (select name from employee);
Цікаво! Сам SQL-запит на отримання імен вийшов навіть коротшим, ніж опис завдання. Творці SQL свій хліб даремно не їли.
Змушений тебе засмутити — такий підхід не працюватиме. Спочатку потрібно заджойнити ці таблиці. Виглядатиме це приблизно так:
UPDATE таблиця1, таблиця2 SET
колонка1 = вираз1,
колонка2 = вираз2,
колонка3 = вираз3
WHERE таблиця1.id = таблиця2.ref_id;
Давай ще трохи ускладнимо завдання. Потрібно встановити рівень у 80 тільки для хороших співробітників, чия зарплата буде більшою за 50к. Повне рішення виглядатиме так:
UPDATE user, хороші_працівники SET
user.level = 80
WHERE user.name = хороші_працівники.name;
Таке об'єднання таблиць — це фактично INNER JOIN
, отже в результаті залишаться лише користувачі, яким знайшлася відповідність на ім'я у другій таблиці.
Але нам потрібно ще якось відібрати хороших співробітників, тому допишемо ще трохи коду:
SELECT * FROM employee WHERE salary >= 50000
І тепер підставимо цю таблицю до нашого фінального запиту:
UPDATE user,
(SELECT * FROM employee WHERE salary >= 50000) good_emps
SET
user.level = 80
WHERE user.name = good_emps.name;
Живи тепер із цим.