JavaRush /Курсы /SQL SELF /Обновление данных с использованием UPDATE

Обновление данных с использованием UPDATE

SQL SELF
21 уровень , 2 лекция
Открыта

Сегодня мы доберемся до ещё одного важного кирпичика вашей новой базы знаний — обновления данных. Посмотрим, как в PostgreSQL менять существующую информацию с помощью команды UPDATE. Почему это важно? Ну, потому что в реальной жизни данные не статичны. Представьте, что ваш друг изменил номер телефона, или студент перевёлся в другую группу — конечно, вам захочется обновить эти данные в базе.

Когда ваша школьная любовь Светка Соколова вдруг стала Светкой Хачатурян (ну, потому что такова жизнь), это требует изменений в вашей базе данных. Сценарии, где нужно обновить данные, встречаются часто:

  • Исправление ошибок в записи.
  • Обновление информации (переезд, изменение статуса).
  • Массовое изменение данных, например, повышение зарплат сотрудникам.

Обновление данных — это способ изменить значения одного или нескольких столбцов для одной или нескольких строк таблицы, не добавляя новых записей.

Синтаксис команды UPDATE

Команда UPDATE в PostgreSQL обладает довольно понятным синтаксисом. Давайте посмотрим на структуру:

UPDATE таблица
SET column1 = value1,
    column2 = value2
WHERE условие;

Пояснения:

  • таблица: имя таблицы, в которой будем что-то менять.
  • SET column = value: параметр, который определяет, какой столбец нужно изменить и каким значением.
  • WHERE условие: условие указывает, какие строки необходимо обновить (очень важно, чтобы не обновить всё подряд).

Ключевая деталь: если вы забудете добавить WHERE (или сделаете это неправильно), ваши изменения коснутся всех строк в таблице. Это может привести к большим неприятностям.

Пример: изменение имени студента

Предположим, у нас есть таблица students с колонками id, name, email. Мы хотим изменить имя студента с id = 1 на "Maria Chi".

UPDATE students
SET name = 'Maria Chi'
WHERE id = 1;

Эта команда найдет строку с id = 1 и обновит столбец name на новое значение. Легко, правда?

Обновление нескольких столбцов

Часто нужно поменять сразу несколько значений в записи. Например, представьте, что студент сменил не только имя, но и адрес электронной почты. Вот как это сделать:

UPDATE students
SET name = 'Otto Lin',
    email = 'otto.lin@example.com'
WHERE id = 2;

Здесь мы обновляем и name, и email для студента с id = 2. PostgreSQL позволяет указать несколько пар столбец=значение через запятую в разделе SET.

Обновление нескольких строк

Как быть, если нужно изменить данные сразу для нескольких строк? Например, вы хотите перевести группу студентов в новые потоки. Для этого можно обновить строки, соответствующие определенному критерию. Допустим, у нас есть поле group_number, и мы хотим перевести всех студентов из группы 101 в группу 202:

UPDATE students
SET group_number = 202
WHERE group_number = 101;

Эта команда обновит все строки, где group_number равен 101, заменив его на 202.

5. Условие WHERE: будьте осторожны!

Как говорилось ранее, WHERE — ваш спасательный круг. Без него запрос затронет все строки таблицы. Например, следующая команда обновит ГРУППУ всех студентов, а не только группы 101. Это то, чего вы точно не хотите:

UPDATE students
SET group_number = 202;

Пожалуйста, всегда добавляйте WHERE, если не хотите случайно разрушить данные. Лучше перестраховаться.

Думайте о команде UPDATE как о команде, которая меняет столбцы таблицы, а не строки. Ее цель присвоить всем ячейкам определенного столбца определенное значение. И только наличие WHERE приводит к тому, что меняются не все строки.

Обновление на основе данных из другой таблицы

Иногда нам нужно не просто «вписать» значение вручную, а обновить значения в таблице А, используя данные из таблицы Б. Такая задача возникает часто — особенно если данные хранятся раздельно: например, расчёты в одной таблице, а пользовательские профили — в другой.

Допустим, у нас есть таблица students, в которой нужно обновить колонку debt, используя таблицу payments, где хранится актуальный размер задолженности (due_amount). Каждой записи в students соответствует запись в payments по полю student_id.

Синтаксис будет выглядеть так:

UPDATE students
SET debt = payments.due_amount
FROM payments
WHERE students.id = payments.student_id;

Что происходит:

  • PostgreSQL использует FROM payments как источник данных.
  • По WHERE условию связывает строки между таблицами.
  • Обновляет только те строки students, у которых есть соответствие в payments.

Важно понимать: внутри этого UPDATE ... FROM фактически происходит скрытое соединение — JOIN, только без ключевого слова JOIN.

Все дело в том, что там под капотом есть скрытый JOIN. Реально выглядит оно примерно так:

UPDATE students
SET debt = p.due_amount
FROM payments p
    JOIN students s ON s.id = p.student_id
WHERE students.id = p.student_id;

Как посмотреть, что именно обновится

Перед тем как запускать UPDATE, очень разумно посмотреть, что именно будет изменено. Это можно сделать с помощью SELECT, написанного по тому же принципу:

SELECT
    students.id, 
    students.name, 
    students.debt AS old_debt, 
    payments.due_amount AS new_debt
FROM students
    JOIN payments ON students.id = payments.student_id;

Результат покажет:

  • старое значение долга (old_debt);
  • новое значение, которое придёт из таблицы payments (new_debt).

Такой подход помогает проверить корректность логики, прежде чем вы навсегда перезапишете данные.

Потенциальные подводные камни

  • Если payments содержит несколько записей на одного студента, UPDATE вызовет ошибку: more than one row returned. Нужно либо использовать агрегирование (MAX, SUM, LIMIT 1), либо убедиться, что student_id в payments — уникален.
  • Не забудьте, что UPDATE ... FROM — это специфическая особенность PostgreSQL и не работает в таком виде в некоторых других СУБД (например, MySQL).

Практические примеры

Пример 1: Изменение статуса студентов

Представим, что студенты, завершившие курс, получают статус "выпускник". У нас есть колонка status. Чтобы обновить статус для студентов с completed_course = true:

UPDATE students
SET status = 'выпускник'
WHERE completed_course = true;

Пример 2: Повышение зарплат сотрудникам

Если у вас есть таблица employees, и вы хотите увеличить зарплату на 10% всем, кто работает в отделе продаж:

UPDATE employees
SET salary = salary * 1.10
WHERE department = 'Sales';

Здесь мы используем математическую операцию прямо в разделе SET. Это удобно для массовых изменений.

Пример 3: Условное обновление

Иногда требуется обновить данные в зависимости от условия. Например, если зарплата сотрудника меньше 50,000, то она должна вырасти на 20%, а если больше — на 10%:

UPDATE employees
SET salary = CASE
                WHEN salary < 50000 THEN salary * 1.20
                ELSE salary * 1.10
             END;

Эта команда использует конструкцию CASE, чтобы задать разные правила обновления в зависимости от значения salary.

Типичные ошибки при использовании UPDATE

Наверное, вы уже догадались, какая самая популярная ошибка? Да, это пропуск WHERE. Попробуйте представить себе ситуацию: у вас база с 10,000 сотрудников, а вы ошибочно увеличили зарплату всем подряд. Даже если это приятно вашим сотрудникам, для вашей карьеры это может быть… не очень.

Другая частая ошибка — обновление неверного столбца. Всегда перепроверяйте, что и куда вы записываете. Простой SELECT перед UPDATE может сэкономить вам массу времени.

2
Задача
SQL SELF, 21 уровень, 2 лекция
Недоступна
Условное обновление зарплаты сотрудников
Условное обновление зарплаты сотрудников
Комментарии (1)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
8 ноября 2025
Хоть темы и достаточно легкие, но хотелось бы больше задач. Их и до этого хотелось больше, чтобы набить руку, но теперь всего по одной задаче, это немного расстраивает.