УДАЛЕНИЕ ВСЕХ СТРОК

Хотя предложение 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 данное ограничение снимается и дается определение, что ссылка на целевую таблицу во вложенном запросе является ссылкой на полную целевую таблицу, из которой еще не удалена ни одна строка.