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;
        

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