JavaRush /Курсы /Модуль 4. Работа с БД /Изменение данных в таблице

Изменение данных в таблице

Модуль 4. Работа с БД
6 уровень , 3 лекция
Открыта

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;
        

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

1
Задача
Модуль 4. Работа с БД, 6 уровень, 3 лекция
Недоступна
task0610
task0610
1
Задача
Модуль 4. Работа с БД, 6 уровень, 3 лекция
Недоступна
task0611
task0611
1
Задача
Модуль 4. Работа с БД, 6 уровень, 3 лекция
Недоступна
Изменения по developer'ам
Напиши запрос, который всем сотрудникам (таблица employee), имеющим в названии позиции (поле position) слово 'developer', установит зарплату (поле salary) в размере 5000 и сменит название позиции на 'fullstack developer'.
1
Задача
Модуль 4. Работа с БД, 6 уровень, 3 лекция
Недоступна
task0613
task0613
1
Задача
Модуль 4. Работа с БД, 6 уровень, 3 лекция
Недоступна
task0614
task0614
Комментарии (14)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Сергей Уровень 109
19 июня 2025
Chat gpt говорит что: UPDATE user SET level = 80 WHERE name IN (SELECT name FROM employee); будет работать. Хотелось бы ясности.
Сергей Уровень 109
19 июня 2025
GPT: 🤨 Так почему автор пишет, что "такой подход работать не будет"? 💡 Возможные причины: Материал рассчитан на разные СУБД, не только MySQL. В некоторых базах данных (особенно старых версиях SQL Server, Oracle) подобные подзапросы в WHERE или FROM в UPDATE могли давать ошибки или неожиданное поведение, особенно если есть дубли или NULL. Педагогический подход: хотят показать “правильный” способ с JOIN, который более гибок и понятен при сложных операциях, особенно когда нужно изменить значение на основе других полей.
Антон Уровень 115
14 января 2025
В лекции: "Вынужден тебя расстроить – такой подход работать не будет" В последней задаче: Делают именно так, как 'нельзя'. Javarush такой javarush 😂
Данила Уровень 111 Expert
21 ноября 2023
Почему у меня вечно не проходит код? Я уже раз 30 сравнил его с правильным решением, 0 отличий, а все равно не проходит
Павел Уровень 19 Expert
5 марта 2024
Надо просто скопировать.
Ольга Николенко Уровень 109 Expert
22 мая 2024
у меня была такая же проблема , оказалось что когда я копировала для некоторых задач условие в sql (где писала ответ), для удобства - часть текста осталась не стертой но сдвинулась за поле видимости
Надежда Уровень 104 Expert
30 августа 2023
Непонятно, почему автор пишет, что такой подход работать не будет. UPDATE user SET level = 80 WHERE user.name IN (SELECT employee.name FROM employee WHERE salary >= 50000); Все отлично работает. Только запятую после 80 не надо ставить.
Даниил Уровень 92 Expert
22 октября 2023
Да, проверил на другой таблице - все действительно работает.
Надежда Уровень 104 Expert
30 августа 2023
Мда.... живи теперь с этим. Не проще ли было написать запрос, чтобы он укладывался в рамки ранее изученного? Например так: UPDATE user JOIN (SELECT name FROM employee WHERE salary >= 50000) AS good_emps ON user.name = good_emps.name SET user.level = 80;
Валерий Уровень 111 Expert
22 октября 2023
Тема то новая
Павел К Уровень 34
18 апреля 2023

(SELECT * FROM employee WHERE salary >= 50000) good_emps
или должно быть

(SELECT * FROM employee WHERE salary >= 50000) AS good_emps
hint1k Уровень 51
7 июня 2023
похоже что второе - правильный вариант
Сергей Уровень 111 Expert
15 декабря 2022
SET qwerty = 111 - нужны пробелы, иначе задачи не примет валидатор. SET qwerty=111 - так не примет, 6 попыток на первой задаче :D
Эдуард Уровень 1 Expert
26 октября 2022
Задача 0614. Сначала пишут что такой подход работать не будет, и тут же дают задачу с ним...