Набагато більше серйозним питанням є можливість зміни деяких або всіх значень в існуючому рядку таблиці, що реалізується за допомогою команди 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 = 'Федченко' викличе помилку.
У пропозиції 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;
а потім результат цього запиту використати для модифікації
UPDATE USP
SET OCENKA = OCENKA - 1
WHERE OCENKA < 4.2
Таким чином, команда UPDATE, що управляє змістом запису, є однієї із ключових у язиці SQL. Вона застосовна як до всіх рядків таблиці, якщо не використається предикат, що визначає записи, що модифікують, так і до конкретних рядків при наявності предиката, що, у свою чергу, може мати досить складну структуру.