Оператор delete удаляет выбранные строки данных из одной таблицы. В предложении from указывается таблица, содержащая строки, которые требуется удалить. В предложении where указываются строки, которые должны быть
Предположим, что недавно принятый на работу Генри Якобсен решил уволиться из компании. Вот оператор delete, удаляющий относящуюся к служащему строку из таблицы sale sre ps :
В приведенном выше примере в предложении where определена одна строка таблицы salesreps, которая будет удалена из этой таблицы. Предложение where имеет знакомый вид — действительно, это то же самое предложение where, которое необходимо включить в оператор select для чтения из таблицы этой же строки. Условия поиска, которые можно задать в предложении where оператора delete, полностью совпадают с условиями поиска, доступными в предложении where оператора select.
Вспомним, что в предложении where оператора select условия поиска могут определять как одну строку, так и набор строк — в зависимости от конкретного условия. То же самое справедливо и для предложения where оператора delete. Предположим, например, что клиент служащего Якобсена, компания InterCorp (идентификатор клиента 2126), отменила все свои заказы. Вот оператор delete, удаляющий заказы из таблицы orders:
В данном примере предложение where выбирает несколько строк таблицы orders, которые затем удаляются из нее. Все строки таблицы orders последовательно проверяются на соответствие условию поиска. Строки, в которых условие поиска имеет значение true, удаляются, а строки, в которых условие поиска имеет значения false или null, сохраняются. Поскольку этот тип оператора delete осуществляет в таблице поиск удаляемых строк, его иногда называют поисковым, в отличие от другого типа оператора delete, всегда удаляющего одну строку и называемого позиционным. Позиционный оператор delete применяется только в программном SQL.
Хотя предложение where в операторе delete является необязательным, оно присутствует почти всегда. Если же оно отсутствует, то удаляются все строки целевой таблицы. Например:
Хотя в результате выполнения приведенного оператора delete таблица orders становится пустой, из базы данных она не удаляется. Определение таблицы orders и ее столбцов остается в базе данных. Таблица по-прежнему существует, и в нее по-прежнему можно добавлять новые строки с помощью оператора insert. Чтобы удалить из базы данных определение таблицы, необходимо использовать оператор drop table.
Такой оператор delete несет в себе потенциальную угрозу удаления необходимых строк, поэтому всегда необходимо задавать условие поиска и обращать внимание на то, отбирает ли оно действительно ненужные строки. Желательно вначале проверить предложение where в интерактивном режиме в составе оператора select и отобразить выбранные строки на экране. Убедившись, что это именно те строки, которые требуется удалить, можно использовать предложение where в операторе delete.
42. ОПЕРАТОР 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 данное ограничение снимается и дается определение, что ссылка на целевую таблицу во вложенном запросе является ссылкой на полную целевую таблицу, из которой еще не удалена ни одна строка.
43. Обновление существующих данных
Обновлять информацию, хранимую в базе данных, требуется тогда, когда соответствующие изменения происходят во "внешнем мире". На примере учебной базы данных это выглядит следующим образом:
• если клиент изменяет количество заказанного товара, в столбце qty таблицы orders должна быть обновлена соответствующая строка;
• если руководитель переходит из одного офиса в другой, столбец mgr таблицы offices и столбец repjdffice таблицы salesreps необходимо обновить, чтобы отобразить новое назначение;
• если личные планы продаж в нью-йоркском офисе увеличиваются на пять процентов, значения столбца quota в соответствующих строках таблицы SALESREPSдолжны быть обновлены.
Во всех приведенных примерах значения данных обновляются для того, чтобы база данных оставалась точной моделью реального мира. Наименьшей единицей информации, которую можно обновить в реляционной базе данных, является значение одного столбца в одной строке.