4.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;

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;

Живи тепер із цим.