Глава 9. ПРИМЕНЕНИЕ ОПЕРАТОРОВ DELETE И TRUNCATE
Поможем в ✍️ написании учебной работы
Поможем с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой

Структура оператора DELETE

Оператор DELETE относится к группе операторов DML SQL и предназначен для удаления строк из таблицы.

Уточним описанную ранее (рис. 3.18) структуру оператора DELETE (рис. 9.1).

Рис. 9.1. Структура оператора DELETE

 

Синтаксис DELETE предусматривает две секции FROM (обязательной является только первая) и необязательную секцию WHERE. Кроме того, допускается применять секцию OUTPUT и опцию TOP.

Оператор DELETE может удалить ноль, одну или более строк из одной таблицы (целевой таблицы), имя которой указывается в первой секции FROM. Следует отметить, что первое ключевое слов FROM может быть опущено.

Во второй секции FROM может быть указано JOIN-выражение для внутреннего соединения целевой таблицы с другими таблицами. Удалению подлежат только те строки целевой таблицы, для которых выполнилось соединение.

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

Простейший пример использования оператора DELETE приведен на рис. 9.2.

 

Рис. 9.2. Удаление всех строк таблицы PROGRESS

 

Сценарий включает два оператора SELECT, позволяющих получить количество строк в таблице PROGRESS до и после выполнения оператора DELETE. Оператором DELETE используется только единственная (первая) секция FROM, указывающая таблицу (в нашем случае это таблица PROGRESS), в которой удаляются строки. Такая форма оператора позволяет удалить все строки таблицы PROGRESS.

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

 

Вторая секция FROM

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

Прежде чем применим JOIN-соединение в операторе DELETE, выполним сценарий на рис. 9.3, позволяющий предварительно оценить количество отбираемых для удаления этим соединением строк.

Рис. 9.3. Удаление всех строк таблицы PROGRESS

 

Заметим, что количество строк в соединении таблиц PROGRESS, STUDENT и GROUPS составляет 23.

На рис. 9.4 представлен пример оператора DELETE, использующего вторую секцию FROM с JOIN-соединением, определяющим подмножество удаляемых строк таблицы PROGRESS. Обратим внимание на то, что JOIN-соединение, указанное в секции FROM, аналогично применяемому в SELECT-запросе сценария на рис. 9.3. Два SELECT-запроса, вычисляющих количество строк в таблице PROGRESS до и после выполнения оператора DELETE, позволяют подсчитать, что в результате его выполнения удалено 23 строки.

 

Рис. 9.4. Применение JOIN-соединения для выбора удаляемых строк

 из таблицы PROGRESS

Обратите внимание: в операторе DELETE (рис. 9.4) опущено ключевое слово FROM для первой секции.

Секция WHERE

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

На рис. 9.5 представлен пример оператора DELETE, использующего секцию WHERE.

 

Рис. 9.5. Применение секции WHERE в операторе DELETE

 

Оператор DELETE (рис. 9.5) удаляет все строки таблицы TEACHER со значением ИСиТ в столбце PULPIT.

Совместное использование секций FROM и WHERE демонстрируется в сценарии на рис. 9.6. Логическое выражение, указанное в секции WHERE, вычисляется для каждой строки результирующего набора, сформированного секцией FROM; все строки таблицы PROGRESS, участвующие в JOIN-соединении и для которых логическое выражение принимает значение «истина», удаляются.

 

Рис. 9.6. Применение секции WHERE в операторе DELETE

Заметим, что операторы DELETE на рис. 9.4 и 9.6 приводят к одному и тому же результату, но выполняются по-разному. Во втором случае проверка логического условия (в секции WHERE) осуществляется для всех строк сформированного секцией FROM результирующего набора. В первом – результирующий набор секции FROM формируется уже с учетом этого логического условия.

Опция TOP

Опция TOP в операторе DELETE применяется непосредственно перед самим удалением и предназначена для ограничения количества удаляемых строк. Как и в случае SELECT-оператора, значение в TOP можно указывать в виде абсолютного (рис. 9.7) значения или в процентах (рис. 9.8).

Заметим, что операторы DELETE на рис. 9.7 и 9.8,за исключением опции TOP, полностью повторяют операторы на рис. 9.6 и 9.5 соответственно. Обратите внимание на количество удаленных строк.

 

Рис. 9.7. Применение опции TOP с абсолютным

значением в операторе DELETE

 

 

Рис. 9.8. Применение опции TOP со значением, заданным

 в процентах в операторе DELETE

 

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

 

Секция OUTPUT

В главе 6 уже пояснялось назначение секции OUTPUT в DML-операторах, предназначенных для изменения таблиц БД. При этом отмечалось, что действие оператора отката транзакции (ROLLBACK) не оказывает влияние на формирование этой секцией результирующего набора.

На рис. 9.9 представлен пример использования секции OUTPUT в операторе DELETE, осуществляющем вывод своего результирующего набора в стандартный выходной поток. Обратите внимание в секции OUTPUT на два момента: запись DELETED.* в секции OUTPUT, позволяющую вывести значения всех столбцов удаляемых строк; возможность указывать псевдонимы столбцов.

 

Рис. 9.9. Применение секции OUTPUT в операторе DELETE

для вывода результирующего набора в стандартный поток

На рис. 9.10 представлен сценарий, в котором с помощью секции OUTPUT оператора DELETE во временную таблицу выводится информация об удаляемых строках таблицы PROGRESS.

Рис. 9.10. Применение секции OUTPUT в операторе DELETE

для вывода результирующего набора во временную таблицу

Дата: 2019-02-25, просмотров: 243.