Хотя предложение WHERE в инструкции DELETE является необязательным, оно присутствует почти всегда. Если же оно отсутствует, то удаляются все строки целевой таблицы. Например:
Удалить информацию обо всех сотрудниках организации
delete from staff;
Хотя в результате выполнения приведенной инструкции таблица STAFF становится пустой, из базы данных она не удаляется. Определение таблицы и ее столбцов остается в базе данных. Таблица по-прежнему существует, и в нее по-прежнему можно добавлять новые строки. Чтобы удалить из базы данных определение таблицы, необходимо использовать инструкцию DROP TABLE.
Инструкция DELETE, приведенная в примере несет в себе потенциальную угрозу удаления необходимых строк, поэтому всегда следует задавать условие отбора и обращать внимание на то, отбирает ли оно действительно ненужные строки. Желательно вначале проверить предложение WHERE в интерактивном режиме в составе инструкции SELECT и отобразить выбранные строки на экране. Убедившись, что это именно те строки, которые требуется удалить, можно использовать предложение WHERE в инструкции на удаление.
Инструкции DELETE с простыми условиями отбора отбирают строки для удаления исключительно на основании содержимого этих строк. Но иногда отбор строк необходимо производить, опираясь на данные из других таблиц. Предположим, вы хотите удалить все объекты, принадлежащие какому-либо владельцу. Не зная его идентификатора, невозможно найти принадлежащие ему объекты. Чтобы найти эти объекты, надо обратиться с запросом к таблице владельцев (OWNER). Для решения подобных задач SQL предоставляет возможность задания подзапросов в предложении WHERE инструкции на удаление. Задача удаления информации об объектах, принадлежащих владельцу Иванову, решается в SQL следующим образом:
delete from property_for_rent
where property_for_rent.ono = (select ono
from owner
where lname = ‘Иванов’);
Подчиненные запросы в предложении WHERE могут иметь несколько уровней вложенности. Они могут также содержать внешние ссылки на целевую таблицу инструкции DELETE. В этом случае предложение FROM инструкции DELETE играет такую же роль, как и предложение FROM инструкции SELECT.
Инструкция UPDATE, синтаксическая диаграмма которой изображена на рисунке 13, обновляет значения одного или нескольких столбцов в выбранных строках одной таблицы.
В инструкции указывается целевая таблица, которая должна быть модифицирована, при этом пользователь должен иметь разрешение на обновление таблицы и каждого конкретного столбца. Предложение WHERE отбирает строки таблицы, подлежащие обновлению. В предложении SET указывается, какие столбцы должны быть обновлены, и для них задаются новые значения. Приведем пример инструкции.
Увеличить заработную плату сотрудника до 300
update staff set salary = 300 where lname = ‘…’;
Условия отбора, которые могут быть заданы в предложении WHERE инструкции UPDATE, в точности соответствуют условиям отбора, доступным в инструкциях SELECT и DELETE.
Как и инструкция DELETE, инструкция UPDATE может одновременно обновить несколько строк, соответствующих условию отбора. Например:
Перевести всех служащих из отделения № 2 в отделение № 1
update staff
set bno = 1 where bno = 2;.
Предложение SET в инструкции представляет собой список операций присваивания, отделяемых друг от друга запятыми. В каждой операции идентифицируется целевой столбец, который должен обновляться, и определяется новое значение для этого столбца. Каждый целевой столбец должен встречаться в списке только один раз; не должно быть двух операций присваивания для одного и того же целевого столбца. Согласно стандарту ANSI/ISO, для целевых столбцов необходимо использовать простые имена, но некоторые СУБД допускают использование полных имен столбцов. Так как эти имена являются ссылками на столбцы целевой таблицы, то в любом случае неоднозначность невозможна.
Выражение в операции присваивания может быть любым допустимым SQL – выражением, результирующее значение которого имеет тип данных, соответствующий целевому столбцу. Необходимо, чтобы значение выражения вычислялось на основе значений строки, которая в данный момент обновляется в целевой таблице. Оно не может включать в себя какие-либо статистические функции или подчиненные запросы.
Если выражение в операции присваивания содержит ссылку на один из столбцов целевой таблицы, то для вычисления выражения используется значение этого столбца в текущей строке, которое было перед обновлением. То же самое справедливо для ссылок на столбцы в предложении WHERE. В качестве примера рассмотрим следующие инструкции: