Набагато більш серйозним питанням є можливість зміни деяких або всіх значень в існуючому рядку таблиці, що реалізується за допомогою команди UPDATE.
Ця команда містить ключове слово UPDATE, де указується ім'я використовуваної таблиці, і пропозиція SET, яка визначає зміну, що вноситься, для необхідного поля таблиці.
Наприклад, щоб змінити оцінки всіх студентів на 5, необхідно використати команду:
UPDATE USP
SET OCENKA =5;
Звичайно, набагато частіше доводиться указувати не все. а тільки певні рядки таблиці для зміни єдиного значення, і з цією метою разом з UPDATE можна використати предикаты^ Наприклад, змінити оцінки на 5 по предмету з кодом 2003. можна виконавши таку команду:
UPDATE USP
SET OCENKA = 5 WHERE PNUM = 2003;
За допомогою команди UPDATE можна модифікувати дані з декількох полів - пропозиція SET може призначати будь-яке число столбцов, відокремлюваних комами. Всі вказані призначення можуть бути зроблені для будь-якого табличного рядка, але тільки для однієї в кожний момент часу. Припустимо, що викладач Вікуліна пішла на пенсію, і замість неї заняття повинна вести викладач Федченко. Це можна реалізувати такою командою:
UPDATE TEACHERS
SET TFAM = 'Федченко', TNAME =
'Светлана', TOTCH = 'Геннадиевна', TDATE =01/09/1999 WHERE TNUM = 4001;
Ця команда передасть новому викладачу Федченко всі поточні учбові предмети з таблиці PREDMET - в нашому прикладі це буде фізика. Проте майте на увазі, що модифікувати відразу багато таблиць в одній команді UPDATE не можна, а отже, не можна і використати назву (префікс) таблиці з ім'ям поля для цієї команди. Тобто, наприклад, пропозиція SET TEACHERS . TFAM = 'Федченко1 викличе помилку.
В пропозиції SET команди UPDATE можна використати вирази, розташовуючи їх в списку для того поля, яке необхідно змінити (нагадаємо, що в пропозиції VALUES команди INSERT виразу використати не можна). Наприклад, для того, щоб збільшити стипендію в 2 разу, можна використати наступну конструкцію:
UPDATE STUDENTS
SET STIP = STIP*2;
При цьому кожного разу. коли команда посилається до вказаного значення поля в пропозиції SET. дія виробляється, зрозуміло, над ще не модифікованими даними поточного запису.
Крім того, можна використати складніші предикати вибору запису для модифікації. Наприклад, якщо необхідно подвоїти тільки стипендію розміром 25.50, то команда буде наступною:
UPDATE STUDENTS
SET STIP = STIP*2
WHERE STIP = 25.50;
і будуть змінені тільки задовольняючі предикату значення.
До речі кажучи, команда UPDATE може працювати з NULL значеннями. Т.к. пропозиція SET не є предикатом, то можна вводити NULL значення так само, як вводяться звичайні дані. Отже, якщо необхідно змінити всі оцінки студентів по учбовому предмету з кодом 2003 на NULL, можна скористатися наступною командою:
UPDATE USP
SET OCENKA = NULL
WHERE PNUM = 2003;
Могутнім засобом модифікації даних є використовування підзапитів в команді модифікації UPDATE Важливий принцип, якого треба дотримувати при роботі з командами модифікації і підзапитами, полягає в тому. що не можна в пропозиції FROM будь-якого підзапиту модифікувати таблицю, до якої посилається основна команда.
Звернете увагу на наступний важливий момент - в команді модифікації UPDATE (до речі, так само. як і в команді INSERT) може виникнути проблематична ситуація, пов'язана з можливими дублікатами рядків, одержуваними в результаті вкладеного запиту. В цьому випадку, якщо в таблиці, що модифікується, є обмеження, які вимушують її значення бути унікальними, команда модифікації або вставки потерпить невдачу. Тому рекомендується яким-небудь чином з'ясувати те, що ці значення могли були вже бути використані в таблиці, перш ніж намагатися вставити або модифікувати запис. Це можна реалізувати за допомогою додавання вкладеного підзапиту, що використовує в предикаті оператори EXISTS, IN < > або аналогічні. -
З другого боку, не варто забувати про заборону посилання у вкладених запитах до таблиці, яка модифікується командою UPDATE. З цієї причини запити і підзапити в командах модифікації мають порою достатньо складну структуру. Крім того, усередині необов'язкового предиката цієї команди можна використати співвіднесені підзапити, анатогично тому як це робиться для DELETE.
Наприклад, наступний запит збільшує розмір стипендії в 2 разу студентам, в яких є оцінки, принаймні. по двох учбових предметах:
UPDATE STUDENTS
SET STIP = STIP*2
WHERE 2 <=
(SELECT COUNT (SNUM)
FROM USP
WHERE STUDENTS.SNUM = USP.SNUM);
Тут внутрішній запит підраховує кількість записів в таблиці успішності для кожного студента, і, якщо воно 2 або більше, предикат основної функції стає істинним, а розмір стипендії модифікується
Розглянемо ще один, достатньо складний, приклад із співвіднесеним підзапитом. Тут будемо модифікувати розмір стипендії для студентів, що мають мінімальний бал в той або інший день:
UPDATE STUDENTS
SET STIP = STIP - 1 WHERE SNUM IN
(SELECT SNUM
FROM USP FIRST
WHERE OCENKA =
(SELECT MIN (OCENKA)
FROM USP SECOND
WHERE FIRST.UDATE = SECOND.UDATE));
Як вже говорилося, до істотного недоліку UPDATE варто віднести неможливість послатися на таблицю, задіяну в будь-якому підзапиті з команди модифікації. Наприклад, неможливо однією командою виконати таку дію, як модифікація оцінок для студентів, в яких оцінки нижче середній. Для виконання цієї дії спочатку доведеться виконати пошук середньої оцінки
SELECT AVG (OCENKA) FROM USP;
а потім результат цього запиту (4.2) використати для модифікації
UPDATE USP
SET OCENKA = OCENKA - 1
WHERE OCENKA < 4.2;
Таким чином, команда UPDATE, що управляє змістом запису, є однією з ключових в мові SQL. Вона застосовна як до всіх рядків таблиці, якщо не використовується предикат, визначальний записи, що модифікуються, так і до конкретних рядків за наявності предиката, який, у свою чергу, може мати достатньо складну структуру.