Структура оператора 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, просмотров: 278.