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 може зекономити тобі купу часу.

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ