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

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

Открыта

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 лекция
Недоступна
Новый euroстандарт
Новый euroстандарт
1
Задача
Модуль 4. Работа с БД,  6 уровень,  3 лекция
Недоступна
Обновление машин
Обновление машин
1
Задача
Модуль 4. Работа с БД,  6 уровень,  3 лекция
Недоступна
Изменения по developer'ам
Изменения по developer'ам
1
Задача
Модуль 4. Работа с БД,  6 уровень,  3 лекция
Недоступна
Повышаем зарплату менеджерам
Повышаем зарплату менеджерам
1
Задача
Модуль 4. Работа с БД,  6 уровень,  3 лекция
Недоступна
Повышаем зарплату правильно
Повышаем зарплату правильно
Комментарии (15)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Underdante
Уровень 74
22 октября, 18:06
а как в последней задаче узнать что в employee. есть employee.id ? идея IntelliJ IDEA 2024.3.2 (Ultimate Edition , плагин не может в задачи по sql
Сергей
Уровень 109
19 июня 2025, 05:35
Chat gpt говорит что: UPDATE user SET level = 80 WHERE name IN (SELECT name FROM employee); будет работать. Хотелось бы ясности.
Сергей
Уровень 109
19 июня 2025, 05:36
GPT: 🤨 Так почему автор пишет, что "такой подход работать не будет"? 💡 Возможные причины: Материал рассчитан на разные СУБД, не только MySQL. В некоторых базах данных (особенно старых версиях SQL Server, Oracle) подобные подзапросы в WHERE или FROM в UPDATE могли давать ошибки или неожиданное поведение, особенно если есть дубли или NULL. Педагогический подход: хотят показать “правильный” способ с JOIN, который более гибок и понятен при сложных операциях, особенно когда нужно изменить значение на основе других полей.
Антон
Уровень 115
14 января 2025, 02:57
В лекции: "Вынужден тебя расстроить – такой подход работать не будет" В последней задаче: Делают именно так, как 'нельзя'. Javarush такой javarush 😂
Данила
Уровень 111
Expert
21 ноября 2023, 07:17
Почему у меня вечно не проходит код? Я уже раз 30 сравнил его с правильным решением, 0 отличий, а все равно не проходит
Павел
Уровень 19
Expert
5 марта 2024, 07:26
Надо просто скопировать.
Ольга Николенко
Уровень 115
Expert
22 мая 2024, 18:22
у меня была такая же проблема , оказалось что когда я копировала для некоторых задач условие в sql (где писала ответ), для удобства - часть текста осталась не стертой но сдвинулась за поле видимости
Надежда
Уровень 104
Expert
30 августа 2023, 17:57
Непонятно, почему автор пишет, что такой подход работать не будет. UPDATE user SET level = 80 WHERE user.name IN (SELECT employee.name FROM employee WHERE salary >= 50000); Все отлично работает. Только запятую после 80 не надо ставить.
Даниил
Уровень 92
Expert
22 октября 2023, 12:59
Да, проверил на другой таблице - все действительно работает.
Надежда
Уровень 104
Expert
30 августа 2023, 12:38
Мда.... живи теперь с этим. Не проще ли было написать запрос, чтобы он укладывался в рамки ранее изученного? Например так: 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, 13:44
Тема то новая
Павел К
Уровень 34
18 апреля 2023, 08:16
(SELECT * FROM employee WHERE salary >= 50000) good_emps
или должно быть
(SELECT * FROM employee WHERE salary >= 50000) AS good_emps
hint1k
Уровень 51
7 июня 2023, 08:02
похоже что второе - правильный вариант
СергейРаботает в ITQ-GroupExpert
15 декабря 2022, 14:40
SET qwerty = 111 - нужны пробелы, иначе задачи не примет валидатор. SET qwerty=111 - так не примет, 6 попыток на первой задаче :D
Эдуард
Уровень 1
Expert
26 октября 2022, 07:33
Задача 0614. Сначала пишут что такой подход работать не будет, и тут же дают задачу с ним...