какое sql выражение считается предпочтительным для удаления всех записей в таблице
Удаление записей из базы данных SQL
Удаление записей
Для удаления записей из таблицы применяется оператор DELETE:
DELETE FROM имяТаблицы WHERE условие;
Данный оператор удаляет из указанной таблицы записи (а не отдельные значения столбцов), которые удовлетворяют указанному условию. Условие — это логическое выражение, различные конструкции которого были рассмотрены в предыдущих лабораторных занятиях.
Следующий запрос удаляет записи из таблицы Customer, в которой значение столбца LName равно ‘Иванов’:
DELETE FROM Customer
WHERE LName = ‘Иванов’
Если таблица содержатся сведения о нескольких клиентах с фамилией Иванов, то все они будут удалены.
В операторе WHERE может находиться подзапрос на выборку данных (оператор SELECT). Подзапросы в операторе DELETE работают точно так же, как и в операторе SELECT. Следующий запрос удаляет всех клиентов из города Москва, при этом уникальный идентификатор города возвращается с помощью подзапроса.
DELETE FROM Customer
WHERE IdCity IN ( SELECT IdCity FROM City WHERE CityName = ‘Москва’ )
Transact-SQL расширяет стандартный SQL, позволяя использовать в инструкции DELETE еще одно предложение FROM. Это расширение, в котором задается соединение, может быть использовано вместо вложенного запроса в предложении WHERE для указания удаляемых строк. Оно позволяет задавать данные из второго FROM и удалять соответствующие строки из таблицы в первом предложении FROM. В частности предыдущий запрос может быть переписан следующим образом
DELETE FROM Customer
FROM Customer k INNER JOIN
City c ON k.IdCity = c.IdCity AND c.CityName = ‘Москва’
Операция удаления записей из таблицы является опасной в том смысле, что связана с риском необратимых потерь данных в случае семантических (но не синтаксических) ошибок при формулировке SQL-выражения. Чтобы избежать неприятностей, перед удалением записей рекомендуется сначала выполнить соответствующий запрос на выборку, чтобы просмотреть, какие записи будут удалены. Так, например, перед выполнением рассмотренного ранее запроса на удаление не помешает выполнить соответствующий запрос на выборку.
FROM Customer k INNER JOIN
City c ON k.IdCity = c.IdCity AND c.CityName = ‘Москва’
Для удаления всех записей из таблицы достаточно использовать оператор DELETE без ключевого слова WHERE. При этом сама таблица со всеми определенными в ней столбцами сохраняется и готова для вставки новых записей. Например, следующий запрос удаляет записи обо всех товарах.
DELETE FROM Product
Задание для самостоятельной работы: Сформулируйте на языке SQL запрос на удаление всех заказов, не имеющих в составе ни одного товара (т. е. все пустые заказы).
Оператор SQL DELETE для удаления данных из таблицы
Оператор SQL DELETE и удаление данных с условием
Оператор SQL DELETE предназначен для удаления данных из таблицы. Он имеет следующий синтаксис:
Если вы хотите выполнить запросы к базе данных из этого урока на MS SQL Server, но эта СУБД не установлена на вашем компьютере, то ее можно установить, пользуясь инструкцией по этой ссылке .
Id | Category | Part | Units | Money |
1 | Транспорт | Автомашины | 110 | 17600 |
2 | Недвижимость | Квартиры | 89 | 18690 |
3 | Недвижимость | Дачи | 57 | 11970 |
4 | Транспорт | Мотоциклы | 131 | 20960 |
5 | Стройматериалы | Доски | 68 | 7140 |
6 | Электротехника | Телевизоры | 127 | 8255 |
7 | Электротехника | Холодильники | 137 | 8905 |
8 | Стройматериалы | Регипс | 112 | 11760 |
9 | Досуг | Книги | 96 | 6240 |
10 | Недвижимость | Дома | 47 | 9870 |
11 | Досуг | Музыка | 117 | 7605 |
12 | Досуг | Игры | 41 | 2665 |
В результате в таблице останутся лишь следующие строки:
Id | Category | Part | Units | Money |
5 | Стройматериалы | Доски | 68 | 7140 |
6 | Электротехника | Телевизоры | 127 | 8255 |
7 | Электротехника | Холодильники | 137 | 8905 |
8 | Стройматериалы | Регипс | 112 | 11760 |
9 | Досуг | Книги | 96 | 6240 |
10 | Недвижимость | Дома | 47 | 9870 |
11 | Досуг | Музыка | 117 | 7605 |
12 | Досуг | Игры | 41 | 2665 |
Пример 4. Чтобы удалить все данные из таблицы ADS, достаточно написать следующий запрос:
Если после выполнения этого запроса обратиться к таблице ADS при помощи оператора SELECT, применяемого для получения выборки данных, то будет выведено сообщение о том, что эта таблица не содержит данных.
Оператору DELETE без условий и ограничений аналогичен оператор TRUNCATE TABLE. Он также удаляет из таблицы все строки, но выполняется намного быстрее.
Примеры запросов к базе данных «Портал объявлений-1» есть также в уроках об операторах INSERT, UPDATE, HAVING и UNION.
DELETE (Transact-SQL)
Удаляет одну или несколько строк из таблицы или представления в SQL Server.
Синтаксические обозначения в Transact-SQL
Синтаксис
Ссылки на описание синтаксиса Transact-SQL для SQL Server 2014 и более ранних версий, см. в статье Документация по предыдущим версиям.
Аргументы
WITH
Задает временный именованный результирующий набор, также называемый обобщенным табличным выражением, который определяется в области действия инструкции DELETE. Результирующий набор получается из инструкции SELECT.
Обобщенные табличные выражения также можно использовать в инструкциях SELECT, INSERT, UPDATE и CREATE VIEW. Дополнительные сведения см. в разделе WITH common_table_expression (Transact-SQL).
TOP ( expression ) [ PERCENT ]
Задает количество или процент удаляемых случайных строк. expression может быть либо числом, либо процентом от числа строк. Строки, на которые ссылается выражение TOP, используемое с инструкциями INSERT, UPDATE и DELETE, не упорядочиваются. Дополнительные сведения см. в разделе TOP (Transact-SQL).
FROM
Необязательное ключевое слово, которое можно использовать между ключевым словом DELETE и целевым аргументом table_or_view_name или rowset_function_limited.
table_alias
Псевдоним, заданный в предложении FROM table_source и представляющий таблицу или представление, строки которых будут удалены.
server_name
Область применения: SQL Server 2008 и более поздних версий.
Имя сервера (с использованием имени связанного сервера или функции OPENDATASOURCE в качестве имени сервера), на котором расположена таблица или представление. Если указано server_name, необходимо указать database_name и schema_name.
database_name
Имя базы данных.
schema_name
Имя схемы, которой принадлежит таблица или представление.
table_or_view_name
Имя таблицы или представления, откуда удаляются строки.
Табличную переменную в пределах ее области действия также можно использовать в качестве источника таблицы в инструкции DELETE.
Представление, на которое ссылается аргумент table_or_view_name, должно быть обновляемым и ссылаться только на одну базовую таблицу в предложении FROM определения представления. Дополнительные сведения об обновляемых представлениях см. в разделе CREATE VIEW (Transact-SQL).
rowset_function_limited
Область применения: SQL Server 2008 и более поздних версий.
Функция OPENQUERY или OPENROWSET в зависимости от возможностей поставщика.
WITH (
Задает одно или несколько табличных указаний, разрешенных для целевой таблицы. Ключевое слово WITH и круглые скобки обязательны. Использование ключевых слов NOLOCK и READUNCOMMITTED запрещено. Дополнительные сведения о табличных указаниях см. в разделе Табличные указания (Transact-SQL).
Возвращает удаленные строки или выражения, основанные на них, как часть операции DELETE. Предложение OUTPUT не поддерживается ни в каких инструкциях DML, направленных на представления и удаленные таблицы. Дополнительные сведения об аргументах и поведении этого предложения см. в статье Предложение OUTPUT (Transact-SQL).
FROM table_source
Задает дополнительное предложение FROM. Это расширение языка Transact-SQL для инструкции DELETE позволяет задавать данные из
Это расширение, в котором задается соединение, может быть использовано вместо вложенного запроса в предложении WHERE для указания удаляемых строк.
Дополнительные сведения см. в разделе FROM (Transact-SQL).
WHERE
Указывает условия, используемые для ограничения числа удаляемых строк. Если предложение WHERE не указывается, инструкция DELETE удаляет все строки из таблицы.
Предусмотрено два вида операций удаления в соответствии с тем, что указывается в предложении WHERE.
Операции удаления с поиском указывают условие поиска для уточнения строк, которые будут удалены. Например, WHERE column_name = value.
Операции удаления по позиции используют предложение CURRENT OF для указания курсора. Удаление осуществляется в текущей позиции курсора. Эта операция может быть более точной, чем инструкция DELETE по найденному, которая использует предложение WHERE search_condition для указания удаляемых строк. Инструкция DELETE по найденному удаляет несколько строк, если условие поиска не определяет уникально одну строку.
Указывает ограничивающие условия для удаляемых строк. Количество предикатов, которое может содержать условие поиска, не ограничено. Дополнительные сведения см. в разделе Условие поиска (Transact-SQL).
CURRENT OF
Указывает выполнение инструкции DELETE в текущей позиции указанного курсора.
GLOBAL
Указывает, что аргумент cursor_name ссылается на глобальный курсор.
cursor_name
Имя открытого курсора, из которого производится выборка. Если существует как глобальный, так и локальный курсор с именем cursor_name, этот аргумент ссылается на глобальный курсор, если указан аргумент GLOBAL, в противном случае он ссылается на локальный курсор. Курсор должен позволять производить обновления.
cursor_variable_name
Имя переменной курсора. Переменная курсора должна содержать ссылку на курсор, обновления которого разрешены.
Рекомендации
Для удаления всех строк в таблице воспользуйтесь инструкцией TRUNCATE TABLE. Инструкция TRUNCATE TABLE выполняется быстрее, чем инструкция DELETE, и использует меньше системных ресурсов и ресурсов журнала транзакций. Инструкция TRUNCATE TABLE имеет ограничения, например, таблица не может участвовать в репликации. Дополнительные сведения см. в разделе TRUNCATE TABLE (Transact-SQL)
Для возврата в клиентское приложение количества удаленных строк используйте функцию @@ROWCOUNT. Дополнительные сведения см. в статье @@ROWCOUNT (Transact-SQL).
Обработка ошибок
Для инструкции DELETE можно реализовать обработку ошибок, заключив инструкцию в конструкцию TRY…CATCH.
При выполнении инструкции DELETE может произойти ошибка, если она нарушает триггер или пытается удалить строку, на которую ссылаются данные в другой таблице с помощью ограничения FOREIGN KEY. Если инструкция DELETE удаляет несколько строк и одна из удаленных строк нарушает триггер или ограничение, то эта инструкция отменяется, т.е. возвращается ошибка и строки не удаляются.
В случае арифметической ошибки (переполнение, деление на ноль или выход за пределы допустимых значений), возникающей в ходе вычисления выражения при выполнении инструкции DELETE, компонент Компонент Database Engine будет обрабатывать эти ошибки, как если бы параметр SET ARITHABORT имел значение ON. Оставшаяся часть пакетной операции отменяется и возвращается сообщение об ошибке.
Совместимость
Инструкцию DELETE можно использовать в тексте определяемой пользователем функции, если изменяемым объектом является табличная переменная.
При удалении строки, содержащей столбец FILESTREAM, также удаляются и связанные с ней файлы файловой системы. Базовые файлы удаляются сборщиком мусора FILESTREAM. Дополнительные сведения см. в разделе Доступ к данным FILESTREAM с помощью Transact-SQL.
Предложение FROM нельзя указывать в инструкции DELETE, ссылающейся (прямо или косвенно) на представление, в котором указан триггер INSTEAD OF. Дополнительные сведения о триггерах INSTEAD OF см. в разделе CREATE TRIGGER (Transact-SQL).
Ограничения
При использовании выражения TOP в инструкции DELETE строки, на которые имеются ссылки, не упорядочиваются, а предложение ORDER BY не может быть прямо указано в этой инструкции. Если необходимо с помощью предложения TOP удалять строки в значимом хронологическом порядке, то вместе с ним в инструкции вложенного запроса выборки следует использовать ORDER BY. См. подраздел «Примеры» далее в этом разделе.
Предложение TOP не может быть использовано вместе с инструкцией DELETE для секционированных представлений.
Режим блокировки
По умолчанию инструкция DELETE всегда получает монопольную блокировку намерения (IX) на объект таблицы, который она изменяет, и держит блокировку до тех пор, пока транзакция не завершится. Если ресурс удерживается монопольной блокировкой намерения (IX), то другие транзакции не могут изменять данные. Операции считывания будут допускаться только при наличии подсказки NOLOCK или уровня изоляции незафиксированной операции чтения. Можно переопределить поведение оптимизатора запросов по умолчанию с помощью табличных подсказок на время выполнения инструкции DELETE указанием другого способа блокировки, но использовать подсказки рекомендуется только опытным разработчикам и администраторам баз данных и только при крайней необходимости. Дополнительные сведения см. в разделе Табличные указания (Transact-SQL).
Когда строки удаляются из кучи, компонент Компонент Database Engine может использовать строку или страницу блокировки для операции. В результате пустые страницы, в которых выполняются операции удаления, остаются размещенными для кучи. Если их не освободить, занимаемое ими место не может быть использовано под другие объекты базы данных.
Чтобы удалить из кучи строки и освободить страницы, воспользуйтесь одним из следующих методов.
Задайте указания TABLOCK в инструкции DELETE. Использование TABLOCK приведет к тому, что при выполнении операции удаления будет установлена монопольная блокировка таблицы, а не блокировка строки или страницы, что позволит освободить страницы. Дополнительные сведения об указании TABLOCK см. в разделе Табличные указания (Transact-SQL).
Перед удалением строк создайте в куче кластеризованный индекс. Потом его можно будет удалить. Этот метод потребует больше времени и потребляет больше временных ресурсов.
Режим ведения журнала
Инструкция DELETE всегда полностью регистрируется в журнале.
Безопасность
Разрешения
Разрешения DELETE необходимы для целевой таблицы. Разрешения SELECT также необходимы, если инструкция содержит предложение WHERE.
Примеры
Категория | Используемые элементы синтаксиса |
---|---|
Основной синтаксис | DELETE |
Ограничение удаляемых строк | WHERE • FROM • курсор • |
Удаление строк из удаленной таблицы | Связанный сервер • OPENQUERY, функция набора строк • OPENDATASOURCE, функция набора строк |
Сбор результатов для инструкции DELETE | OUTPUT, предложение |
Базовый синтаксис
В примерах в этом разделе описывается базовая функциональность инструкции DELETE с помощью минимального необходимого синтаксиса.
A. Использование инструкции DELETE без предложения WHERE
Ограничение удаляемых строк
В примерах в этом разделе описываются способы ограничения количества удаляемых строк.
Б. Использование предложения WHERE для удаления набора строк
В. Использование курсора для определения удаляемой строки
Г. Использование операторов объединения и вложенных запросов к данным в одной таблице для удаления строк в другой таблице
Д. Ограничение числа удаляемых строк с помощью ключевого слова TOP
Если с инструкцией DELETE применяется предложение TOP (n), то операция удаления производится над n случайно выбранными строками. Следующий пример удаляет 20 случайных строк из таблицы PurchaseOrderDetail в базе данных AdventureWorks2012, имеющих дату ранее 1 июля 2006 г.
Если необходимо с помощью предложения TOP удалять строки в значимом хронологическом порядке, то вместе с ним в инструкции вложенного запроса выборки следует использовать ORDER BY. Следующий запрос удаляет из таблицы PurchaseOrderDetail 10 строк, имеющих самую раннюю дату. Чтобы гарантировать удаление только 10 строк, столбец, указанный в инструкции подзапроса выборки ( PurchaseOrderID ) должен являться первичным ключом таблицы. Использование неключевого столбца в инструкции подзапроса выборки может привести к удалению более чем 10 строк, если указанный столбец содержит повторяющиеся значения.
Удаление строк из удаленной таблицы
В примерах в этом разделе описаны способы удаления строк из удаленной таблицы с использованием в качестве ссылки на удаленную таблицу связанного сервера или функции, возвращающей набор строк. Удаленная таблица существует на другом сервере или экземпляре SQL Server.
Область применения: SQL Server 2008 и более поздних версий.
Е. Удаление данных из удаленной таблицы с помощью связанного сервера
Ж. Удаление данных из удаленной таблицы с помощью функции OPENQUERY
З. Удаление данных из удаленной таблицы с помощью функции OPENDATASOURCE
В следующем примере выполняется удаление строк из удаленной таблицы с помощью вызова функции OPENDATASOURCE, возвращающей набор строк. Определите допустимое имя сервера для источника данных, используя формат server_name или server_name\instance_name.
Сбор результатов для инструкции DELETE
И. Использование инструкции DELETE с предложением OUTPUT
Следующий пример демонстрирует способы сохранения результатов инструкции DELETE в табличную переменную в базе данных AdventureWorks2012.
К. Использование предложения OUTPUT с аргументом в инструкции DELETE
Примеры: Azure Synapse Analytics и Система платформы аналитики (PDW)
Л. Удаление всех строк из таблицы
М. Инструкция DELETE для удаления набора строк из таблицы
Н. Использование предложения LABEL с инструкцией DELETE
В следующем примере используется метка с инструкцией DELETE.
О. Использование метки и указания запроса с инструкцией DELETE
Этот запрос показывает базовый синтаксис для использования указания на соединение с запросом с инструкцией INSERT. Дополнительные сведения об указаниях соединения и использовании предложения OPTION см. в статье Предложение OPTION (Transact-SQL).
П. Удаление с помощью предложения WHERE
В этом запросе показано, как удалить с помощью предложения WHERE вместо предложения FROM.
Т. Удаление по результатам соединения с другой таблицей
В этом примере показано, как выполнять удаление из таблицы на основе результатов соединения с другой таблицей.
Удалить все записи из таблицы
Как с помощью SQL можно удалить все записи из таблицы?
Добавлено через 3 часа 29 минут
Все таки нашла:
Как передать имя таблицы в хранимую процедуру и потом удалить все записи в ней?
есть процедура CREATE PROCEDURE check_table @table_name nvarchar(100), @drop_table int.
Выборка таблицы по условию если ничего не найдено, вернуть все записи таблицы!
Добрый день! забыл как сделать выборку, есть такой запрос: select * FROM Applications WHERE Id.
Удалить все записи из таблицы
Как удалить все записи из таблицы Delphi?
Можно-ли на VB6 удалить все записи из таблицы Access не перебирая их?
1. Можно-ли на VB6 удалить все записи из таблицы Access не перебирая их? 2. Нужно из таблицы.
Удалить из таблицы все записи кроме записей по двум условиям
Здравствуйте! Подскажите как удалить из таблицы все записи кроме записей по двум условиям. Пробую.
Как из таблицы удалить все записи, кроме тех, где колонка middlename не пустая?
Привет! Подскажите пожалуйста,как из таблицы удалить все записи кроме тех где колонка middlename.
SQL Инструкция DELETE
SQL DELETE
Инструкция DELETE используется для удаления существующих записей в таблице.
Синтаксис DELETE
Примечание: Будьте осторожны при удалении записей в таблице! Обратите внимание на предложение WHERE в инструкции DELETE. Предложение WHERE указывает, какие записи должны быть удалены. Если вы опустите предложение WHERE, то все записи в таблице будут удалены!
Демо база данных
Ниже приведен выбор из таблицы «Customers» в образце базы данных Northwind:
CustomerID | CustomerName | ContactName | Address | City | PostalCode | Country |
---|---|---|---|---|---|---|
1 |
Пример SQL DELETE
Следующая инструкция SQL удаляет клиента «Alfreds Futterkiste» из таблицы «Customers»:
Пример
Таблица «Customers» теперь будет выглядеть так:
CustomerID | CustomerName | ContactName | Address | City | PostalCode | Country |
---|---|---|---|---|---|---|
2 | Ana Trujillo Emparedados y helados | Ana Trujillo | Avda. de la Constitución 2222 | México D.F. | 05021 | Mexico |
3 | Antonio Moreno Taquería | Antonio Moreno | Mataderos 2312 | México D.F. | 05023 | Mexico |
4 |
Удалить все записи
Можно удалить все строки в таблице, не удаляя саму таблицу. Это означает, что структура таблицы, атрибуты и индексы останутся нетронутыми:
Следующая инструкция SQL удаляет все строки в таблице «Customers», не удаляя таблицу: