Конечно, вы не всегда захотите указывать все строки таблицы для изменения единственного значения, так что UPDATE, наподобие DELETE, может брать предикаты. Вот как, например, можно выполнить изменение, одинаковое для всех заказчиков продавца Peel (имеющего snum=1001):
UPDATE Customers
SET rating = 200
WHERE snum = 1001;
Команда UPDATE для многих столбцов
Однако вы не должны ограничивать себя модифицированием единственного столбца с помощью команды UPDATE. Предложение SET может назначать любое число столбцов, отделяемых запятыми. Все указанные назначения могут быть сделаны для любой табличной строки, но только для одной в каждый момент времени. Предположим, что продавец Motika ушел на пенсию, и мы хотим переназначить его номер новому продавцу:
UPDATE Salespeople
SET sname = 'Gibson', city = 'Boston', comm =.10
WHERE snum = 1004;
Эта команда передаст новому продавцу Gibson, всех текущих заказчиков бывшего продавца Motika и Заказы, в том виде, в котором они были скомпонованы для Motika с помощью поля snum.
Вы не можете, однако, модифицировать сразу много таблиц в одной команде, частично потому, что вы не можете использовать префиксы таблицы со столбцами измененными предложением SET. Другими словами, вы не можете сказать — "SET Salespeople.sname = Gibson" в команде UPDATE, вы можете сказать только так — "SET sname = Gibson".
Использование выражений для модификации
Вы можете использовать скалярные выражения в предложении SET команды UPDATE, однако, включив его в выражение поля, которое будет изменено. В этом их отличие от предложения VALUES команды INSERT, в котором выражения не могут использоваться; это свойство скалярных выражений — весьма полезная особенность. Предположим, что вы решили удвоить комиссионные всем вашим продавцам. Вы можете использовать следующее выражение:
UPDATE Salespeople
SET comm = comm * 2;
Всякий раз, когда вы ссылаетесь к указанному значению столбца в предложении SET, произведенное значение может получиться из текущей строки, прежде в ней будут сделаны какие-то изменения с помощью команды UPDATE. Естественно, вы можете скомбинировать эти особенности, и сказать, — удвоить комиссию всем продавцам в Лондоне, таким предложением:
UPDATE Salespeople
SET comm = comm * 2
WHERE city = 'London';
Модифицирование пустых (NULL) значений
Предложение SET — это не предикат. Он может вводить пустые NULL значения так же, как он вводил значения, не используя какого-то специального синтаксиса (такого, например, как IS NULL). Так что, если вы хотите установить все оценки заказчиков в Лондоне в NULL, вы можете ввести следующее предложение:
UPDATE customers
SET rating = NULL
WHERE city = 'London';
что обнулит все оценки заказчиков в Лондоне.
Резюме
Теперь вы овладели мастерством управления содержанием вашей базы данных с помощью трех простых команд:
INSERT — используемой чтобы помещать строки в базу данных;
DELETE — чтобы удалять их;
UPDATE — чтобы изменять значения в уже вставленных строках.
Вы обучались использованию предиката с командами UPDATE и DELETE, чтобы определять, на которую из строк будет воздействовать команда. Конечно, предикаты как таковые не значимы для INSERT, потому что обсуждаемая строка не существует в таблице до окончания выполнения команды INSERT. Однако, вы можете использовать запросы с INSERT, чтобы сразу помещать все наборы строк в таблицу. Причем это вы можете делать со столбцами в любом порядке.
Вы узнали, что значения по умолчанию могут помещаться в столбцы, если вы не устанавливаете это значение явно. Вы также видели использование стандартного значения по умолчанию, которым является NULL. Кроме того, вы поняли, что UPDATE может использовать выражение значения, тогда как INSERT не может.
Следующая глава расширит ваши познания, показав вам, как использовать подзапросы с этими командами. Эти подзапросы напоминают те, с которыми вы уже знакомы, но имеются некоторые специальные выводы и ограничения, когда подзапросы используются в командах DML, что мы будем обсуждать в Главе 16.
Работа с SQL
1. Напишите команду, которая бы поместила следующие значения, в их нижеуказанном Заказе, в таблицу Продавцов:
city — San Jose,
name — Bianco,
comm — NULL,
cnum — 1100.
2. Напишите команду, которая бы удалила все Заказы заказчика Clemens из таблицы Заказов.
3. Напишите команду, которая бы увеличила оценку всех заказчиков в Риме на 100.
4. Продавец Serres оставил компанию. Переназначьте его заказчиков продавцу Motika.
(См. Приложение A для ответов.)