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;
        

Живи теперь с этим.

undefined
1
Задача
Модуль 4. Работа с БД, 6 уровень, 3 лекция
Недоступна
task0610
task0610
undefined
1
Задача
Модуль 4. Работа с БД, 6 уровень, 3 лекция
Недоступна
task0611
task0611
undefined
1
Задача
Модуль 4. Работа с БД, 6 уровень, 3 лекция
Недоступна
Изменения по developer'ам
Напиши запрос, который всем сотрудникам (таблица employee), имеющим в названии позиции (поле position) слово 'developer', установит зарплату (поле salary) в размере 5000 и сменит название позиции на 'fullstack developer'.
undefined
1
Задача
Модуль 4. Работа с БД, 6 уровень, 3 лекция
Недоступна
task0613
task0613
undefined
1
Задача
Модуль 4. Работа с БД, 6 уровень, 3 лекция
Недоступна
task0614
task0614