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;
Живи теперь с этим.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ