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;
Живи тепер із цим.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ