Программирование >>  Sql: полное руководство 

1 ... 76 77 78 [ 79 ] 80 81 82 ... 264


WHERE cust = cust NUM

AND ORDER DATE > 40-NOV-89)

6 rows deleted.

Приведенная выше шгструкщм delete выполняется таким образом- каждая строка таблицы customers по очереди проверяется на соответствие условию отбора. Для каждого клиента подчиненный запрос отбирает все заказы, сделанные этим клиентом после указанной даты. Ссылка на столбец CUST num в подчиненном запросе является внешней ссьшкой на идентификатор клиента той строки таблицы customers, которая проверяется инструкцией delete в настоящий момент. Подчиненный запрос в данном примере является коррелированным (такие запросы рассматривались в главе 9)

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

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

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

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

если руководитель переходит из одного офиса в другой, столбец mgr таблицы

offices и столбец rep office ТаблиЦЫ salesreps НеобхОДИМО ОбнОВИТЬ, ЧТОбы

отобразить новое назначение;

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

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

Инструшия UPDATE

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



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

I- UPDATE имя таблицы SET-j- имя столбца = выражение

WHERE условив отбора

Рис 106 Синтаксическая диаграмма инструкции 11 DA:E

Следующая инструкция update изменяет лимит кредита для клиента и закрепляет последнего за новым служащим;

Увеличить лимит кредита для компании Acme Manufacturing до $60000 и закрепить ее за Мэри Джонс (идентификатор 109).

update customers

set credit limit = 60000.00, cust rep = 109 where company = Acme Mfg.

1 row updated.

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

select и delete.

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

Перевести всех служащих из чикагского офиса (идентификатор 12) в нью-йоркский офис (идентификатор 11) и понизить их личные планы на десять процентов.

update salesreps

set rep office = 11, quota - .9 * quota where rep office = 12

3 rows updated.

В данном гфимере предложение where отбирает несколько строк таблицы salesreps, и в них обновляются столбцы office и quota. ИнСТруКЦИЯ update вьшолняется таким образом: все строки таблицы salesreps по очереди проверяются на соответствие условию отбора. Строки, для которых условие отбора выполняется (результат проверки имеет значение true), обновляются, а строки, для которых условие не выполняется (результат проверки имеет значение false или null), не обновляются. Поскольку инструкция update данного типа производит в таблице



поиск строк, она иногда называется поисковой. Инструкция update другого типа, всегда обновляющая одну строку, называется позиционной. Позиционная инструкция update применяется только в программном SQL.

Ниже приведены дополнительные примеры использования поисковых инструкций update:

Перевести всех клиентов, обслуживаемых служащими с идентификаторами 105, 106 и 107, к служащему с идентификатором 102.

UPDATE CUSTOMERS

SET CUST REP = 102 WHERE CUST REP IN (105, 106, 107)

5 rows updated.

Установить личный план в $100000 всем служащим, не имеющим в настоящий момент плана.

UPDATE SALESREPS

SET QUOTA = 100000.00 WHERE QUOTA IS NULL

1 row updated.

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

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

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

UPDATE OFFICES

SET QUOTA = 400000.00, SALES = QUOTA WHERE QUOTA < 400000.00

До обновления личный план (quota) Билла Адамса составлял $350000, а объем Продаж (sales) - $36791L После обновления объем продаж (sales) в его строке стал равен $350000, а не $400000. Таким образом, порядок операций присваивания в предложении зет не играет роли; он может быть любым.



1 ... 76 77 78 [ 79 ] 80 81 82 ... 264

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика