Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
УМП-БД.doc
Скачиваний:
17
Добавлен:
05.12.2018
Размер:
1.26 Mб
Скачать
  1. Оператор delete с вложенным запросом *

Операторы delete с простыми условиями поиска, рассмотренные в предыдущих примерах, отбирают строки для удаления исключительно на основании содержимого этих строк. Но иногда отбор строк необходимо производить, опираясь на данные из других таблиц. Предположим, например, что вы хотите удалить все заказы, принятые служащей Сью Смит. Не зная ее идентификатора, вы не сможете найти ее заказы, пользуясь одной только таблицей orders. Чтобы найти эти заказы, можно было бы воспользоваться запросом к двум таблицам:

Однако в операторе delete запрещено использовать объединение таблиц. Оператор delete с параллельным удалением из двух таблиц является неправильным:

Вложенный запрос находит идентификатор Сью Смит, а затем предложение where отбирает заказы с данным идентификатором. Как видно из этого примера, вложенные запросы в операторе delete играют важную роль, поскольку они позволяют удалять строки, основываясь на информации, содержащейся в других таблицах. Вот еще два примера операторов delete, в которых используются условия поиска с вложенным запросом:

Вложенные запросы в предложении where могут иметь несколько уровней вложенности. Они могут также содержать внешние ссылки на целевую таблицу оператора delete. В этом случае предложение from оператора delete играет такую же роль, как и предложение from оператора select. Вот пример запроса на удаление, в котором требуется использовать вложенный запрос, содержащий внешнюю ссылку:

Приведенный выше оператор delete выполняется таким образом: каждая строка таблицы customers по очереди проверяется на соответствие условию поиска. Для каждого клиента вложенный запрос отбирает все заказы, размещенные этим клиентом после указанной даты. Ссылка на столбец cust_num во вложенном запросе является внешней ссылкой на идентификатор клиента той строки таблицы customers, которая проверяется оператором delete в настоящий момент. Вложенный запрос в данном примере является связанным вложенным запросом.

Во вложенном запросе оператора delete внешние ссылки встречаются часто, поскольку они реализуют "объединение' между таблицами (таблицей) вложенного запроса и целевой таблицей оператора delete. Единственное ограничение на применение вложенных запросов в операторе delete заключается в том, что целевую таблицу нельзя указывать в предложении from вложенного запроса независимо от уровня вложенности. Это предотвращает ссылки из вложенных запросов на целевую таблицу (часть строк которой может быть уже удалена), за исключением внешних ссылок на строку, проверяемую в данный момент на соответствие условию поиска оператора delete. В стандарте SQL2 данное ограничение снимается и дается определение, что ссылка на целевую таблицу во вложенном запросе является ссылкой на полную целевую таблицу, из которой еще не удалена ни одна строка.

  1. Обновление существующих данных

Обновлять информацию, хранимую в базе данных, требуется тогда, когда соответствующие изменения происходят во "внешнем мире". На примере учебной базы данных это выглядит следующим образом:

• если клиент изменяет количество заказанного товара, в столбце qty таблицы orders должна быть обновлена соответствующая строка;

• если руководитель переходит из одного офиса в другой, столбец mgr таблицы offices и столбец repjdffice таблицы salesreps необходимо обновить, чтобы отобразить новое назначение;

• если личные планы продаж в нью-йоркском офисе увеличиваются на пять процентов, значения столбца quota в соответствующих строках таблицы SALESREPS должны быть обновлены.

Во всех приведенных примерах значения данных обновляются для того, чтобы база данных оставалась точной моделью реального мира. Наименьшей единицей информации, которую можно обновить в реляционной базе данных, является значение одного столбца в одной строке.

ОПЕРАТОР UPDATE

Оператор update обновляет значения одного или нескольких столбцов в выбранных строках одной таблицы. В операторе указывается целевая таблица, которая должна быть модифицирована, при этом пользователь должен иметь разрешение на обновление таблицы и каждого конкретного столбца. Предложение where отбирает строки таблицы, подлежащие обновлению. В предложении set указывается, какие столбцы должны быть обновлены, и для них задаются новые значения.

В этом примере в предложении WHERE определена одна строка таблицы CUSTOMERS, а предложение set присваивает новые значения двум столбцам этой строки. Условия поиска, которые могут быть заданы в предложении where оператора update, в точности соответствуют условиям поиска, доступным в операторах select и delete.

Как и оператор delete, оператор update может одновременно обновить несколько строк, соответствующих условию поиска. Например:

Оператор update выполняется таким образом: все строки таблицы salesreps по очереди проверяются на соответствие условию поиска. Строки, для которых условие поиска выполняется (результат проверки имеет значение true), обновляются, а строки, для которых условие не выполняется (результат проверки имеет значение false или null), не обновляются. Поскольку оператор update данного типа производит в таблице поиск строк, он иногда называется поисковым. Другой тип оператора update, всегда обновляющий одну строку, называется позиционным. Позиционный оператор update применяется только в программном SQL.

Предложение set в операторе update представляет собой список операций присваивания, отделяемых друг от друга запятыми. В каждой операции идентифицируется целевой столбец, который должен обновляться, и определяется новое значение для этого столбца. Каждый целевой столбец должен встречаться в списке только один раз; не должно быть двух операций присваивания для одного и того же целевого столбца. Согласно стандарту ANSI/ISO, для целевых столбцов необходимо использовать простые имена, но некоторые СУБД допускают использование полных имен столбцов. Так как эти имена являются ссылками на столбцы целевой таблицы, то в любом случае неоднозначность невозможна.

Выражение в операции присваивания может быть любым правильным выражением SQL, результирующее значение которого имеет тип данных, соответствующий целевому столбцу. Необходимо, чтобы значение выражения вычислялось на основе значений строки, которая в данный момент обновляется в целевой таблице. Оно не может включать в себя какие-либо агрегатные функции или вложенные запросы.

Если выражение в операции присваивания содержит ссылку на один из столбцов целевой таблицы, то для вычисления выражения используется значение этого столбца в текущей строке, которое было перед обновлением. То же самое справедливо для ссылок на столбцы в предложении where. В качестве примера рассмотрим следующий (несколько надуманный) оператор UPDATE:

Таким образом, порядок операций присваивания в предложении set не играет роли; он может быть любым.

ОБНОВЛЕНИЕ ВСЕХ СТРОК

Предложение where в операторе update является необязательным. Если оно опущено, то обновляются все строки целевой таблицы. Например:

В отличие от оператора delete, в котором предложение where практически никогда не опускается, оператор update и без предложения where выполняет полезную функцию. Он применяется, в основном, для общего обновления всей таблицы, что было продемонстрировано в предыдущем примере.

ОПЕРАТОР UPDATE С ВЛОЖЕННЫМ ЗАПРОСОМ

В операторе update, так же как и в операторе delete, вложенные запросы могут играть важную роль, поскольку они дают возможность отбирать строки для обновления, опираясь на информацию из других таблиц. Ниже приведены примеры операторов update, в которых используются вложенные запросы:

Вложенные запросы в предложении where оператора update, так же как и в операторе delete, могут иметь любой уровень вложенности и содержать внешние ссылки на целевую таблицу оператора update. Имя столбца empl_NUm во вложенном запросе предыдущего примера является такой внешней ссылкой; она относится к столбцу empl_NUm той строки таблицы salesreps, которая проверяется в настоящий момент оператором update. Вложенный запрос в этом примере является связанным вложенным запросом.

Внешние ссылки часто встречаются во вложенных запросах оператора update, поскольку они реализуют объединение между таблицами (таблицей) вложенного запроса и целевой таблицей оператора update. Для оператора update справедливо то же самое ограничение стандарта SQL1, что и для оператора delete: имя целевой таблицы не может присутствовать в предложении from вложенного запроса на любом уровне вложенности. Это предотвращает ссылки из вложенных запросов на целевую таблицу (часть строк которой уже может быть модифицирована). Таким образом, все ссылки во вложенных запросах на целевую таблицу являются внешними ссылками на ту строку целевой таблицы, которая проверяется в данный момент предложением where оператора update. В стандарте SQL2 это ограничение также устраняется и устанавливается, что ссылка на целевую таблицу во вложенном запросе считается ссылкой на исходную целевую таблицу, в которой еще не были сделаны какие-либо обновления.

29