Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Подготовка к ПР_2.4.rtf
Скачиваний:
4
Добавлен:
01.05.2025
Размер:
7.36 Mб
Скачать

1.2. Удаление записей

Для удаления записей из таблицы применяется оператор DELETE (удалить):

DELETE FROM имя Таблицы WHERE условие;

Данный оператор удаляет из указанной таблицы записи (а не от­дельные значения столбцов), которые удовлетворяют указанному условию. Условие - это логическое выражение. Следующий запрос удаляет записи из таблицы клиенты, в кото­рой значение столбца имя равно 'Иванов':

DELETE FROM Клиенты WHERE Имя = 'Иванов';

Если таблица Клиенты содержит несколько записей, в которых есть клиент Иванов, то все они будут удалены. В операторе WHERE может находиться подзапрос на выборку дан­ных (оператор SELECT). Подзапросы в операторе DELETE работают точно так же, как и в операторе SELECT.

Пусть в базе данных имеется таблица Продажи (ID_товара, Сумма_заказа, ID_клиента), содержащая сведения о продажах това­ров клиентам. Требуется удалить из этой таблицы записи о тех клиентах, которые приобрели товары на сумму, меньшую 1000. Для этого можно использовать такой запрос:

DELETE FROM Продажи Т1

WHERE 1000 >=

(SELECT SUM(Т2.Сумма_заказа) FROM Продажи Т2

WHERE Т1.ID_клиента= Т2.ID_клиента);

Здесь запрос на удаление записей из таблицы продажи содержит связанный (коррелированный) подзапрос, вычисляющий сумму значений столбца Сумма_заказа. Обратите внимание на исполь­зование двух различных псевдонимов для одной и той же табли­цы. При выполнении данного запроса на удаление происходит, как и положено в случае связанных подзапросов, последователь­ный просмотр записей в таблице продажи. Для каждой записи проверяется условие оператора WHERE, а именно выполняется под­запрос, вычисляющий сумму значений столбца Cумма_заказа для всех записей, в которых идентификатор клиента равен значению этого идентификатора в текущей записи (текущей называется запись, просматриваемая в данный момент). Если вычисленное значение не превышает 1000, то условие оператора WHERE выпол­няется и текущая запись удаляется, в противном случае запись не удаляется. Далее происходит переход к следующей записи, рассматриваемой в качестве текущей, и описанные действия по­вторяются снова.

Теперь рассмотрим пример, в котором требуется удалить записи в одной таблице в соответствии с условием, обрабатывающим записи в другой таблице. Допустим, в базе данных имеются две таблицы:

Продажи (ID_товара, Сумма_заказа, ID_клиента);

Клиенты (ID_клиента, Имя, Адрес).

Требуется удалить из таблицы Клиенты те записи о клиентах, кото­рые приобрели товары на сумму, меньшую 1000. Суммы заказов клиентов содержатся в таблице Продажи, а записи необходимо удалять из таблицы клиенты, в которой нет данных о приобре­тенных товарах. Тем не менее, для решения этой задачи можно использовать запрос, аналогичный предыдущему:

DELETE FROM Клиенты Т1

WHERE 1000 >=

(SELECT SUM(Т2.Сумма_заказа) FROM Продажи Т2

WHERE Т1. ID_клиента= Т2 . ID_клиента) ;

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

SELECT * FROM Клиенты Т1

WHERE 1000 >=

(SELECT SUM(Т2.Сумма_заказа) FROM Продажи Т2

WHERE Т1.ID_клиента= Т2.ID_клиента);

Для удаления всех записей из таблицы достаточно использовать оператор DELETE без ключевого слова WHERE. При этом сама таблица со всеми определенными в ней столбцами остается и готова для вставки новых записей.

Например:

DELETE FROM Клиенты;

Таблица может иметь ограничения (см. пункт 2.1), которые могут препятствовать удалению некоторых или всех записей.