Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Для УМК БД.doc
Скачиваний:
77
Добавлен:
19.08.2019
Размер:
1.35 Mб
Скачать

Удаление данных

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

            DELETE FROM STUDENTS;                       

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

DELETE FROM STUDENTS                   

WHERE SNUM = 3416;                      

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

В команде DELETE допускается использовать предикат, выбирающий целую группу строк. Например, следующая команда удаляет из таблицы USP все данные, относящиеся к оценкам, полученным 10/06/1999:

DELETE FROM USP

WHERE UDATE = 10/06/1999;

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

DELETE FROM STUDENTS WHERE SNUM = (SELECT SNUM FROM USP

WHERE OCENKA = 3) ;

В данном случае подзапрос выберет всех студентов, имеющих тройки, из таблицы успеваемости, и в предикат основной команды вернет номера их студенческих билетов.

Допускается в предикате команды DELETE использовать и подзапросы, что дает возможность установить довольно сложные критерии того, какие строки будут удаляться. Кроме того, очень эффективно выполнять сначала вторичные действия (проверки и т.п.), после чего выполнять само удаление. Хотя нельзя ссылаться на таблицу, из которой будут удаляться записи, в предложении FROM подзапроса, в предикате допускается ссылка на текущую строку этой таблицы, т.е. можно использовать соотнесенные подзапросы. Например:

DELETE FROM STUDENTS WHERE EXISTS (SELECT * FROM USP

WHERE OCENKA. = 3

AND STUDENTS . SNUM = USP. SNUM);

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

В целом, структура команды DELETE достаточно проста для понимания, поэтому более подробно на ней останавливаться не будем.