===== Оператор DELETE =====
удаляет строки из временных или постоянных базовых таблиц, представлений или курсоров, причем в двух последних случаях действие оператора распространяется на те базовые таблицы, из которых извлекались данные в эти представления или курсоры. Оператор удаления имеет простой синтаксис:
1. DELETE FROM <имя таблицы>
2. [WHERE <предикат>];
Если предложение **WHERE** отсутствует, удаляются все строки из таблицы или представления (представление должно быть обновляемым). Более быстро эту операцию (удаление всех строк из таблицы) можно в [[http://www.sql-tutorial.ru/ru/termins/tsql.html|Transact-SQL]] также выполнить с помощью команды
1. TRUNCATE TABLE <имя таблицы>
Однако есть ряд особенностей в реализации команды **TRUNCATE TABLE**, которые следует иметь в виду:
* Элемент ненумерованного спискане журнализируется удаление отдельных строк таблицы; в журнал записывается только освобождение страниц, которые были заняты данными таблицы;
* не отрабатывают триггеры, в частности, триггер на удаление;
* команда неприменима, если на данную таблицу имеется ссылка по внешнему ключу, и даже если внешний ключ имеет опцию каскадного удаления.
* значение счетчика **(IDENTITY)** сбрасывается в начальное значение.
**Пример**
**Требуется удалить из таблицы Laptop все портативные компьютеры с размером экрана менее 12 дюймов.**
1. DELETE FROM Laptop
2. WHERE screen < 12;
Все блокноты можно удалить с помощью оператора
1. DELETE FROM Laptop;
или
1. TRUNCATE TABLE Laptop;
Transact-SQL расширяет синтаксис оператора **DELETE**, вводя дополнительное предложение **FROM**:
FROM <источник табличного типа>
При помощи источника табличного типа можно конкретизировать данные, удаляемые из таблицы в первом предложении **FROM**.
При помощи этого предложения можно выполнять соединения таблиц, что логически заменяет использование подзапросов в предложении **WHERE** для идентификации удаляемых строк. Поясним сказанное на примере.
**Пример**
**Пусть требуется удалить те модели ПК из таблицы Product, для которых нет соответствующих строк в таблице PC.**
Используя стандартный синтаксис, эту задачу можно решить следующим запросом:
1. DELETE FROM Product
2. WHERE type = 'pc' AND
3. model NOT IN (SELECT model
4. FROM PC
5. );
Заметим, что предикат type = 'pc' необходим здесь, чтобы не были удалены также модели принтеров и портативных компьютеров.
Эту же задачу можно решить с помощью дополнительного предложения **FROM** следующим образом:
1. DELETE FROM Product
2. FROM Product pr LEFT JOIN
3. PC ON pr.model = PC.model
4. WHERE type = 'pc' AND
5. PC.model IS NULL;
Здесь применяется внешнее соединение, в результате чего столбец PC.model для моделей ПК, отсутствующих в таблице PC, будет содержать **NULL**-значение, что и используется для идентификации подлежащих удалению строк.
===== Оператор TRUNCATE TABLE =====
Как отмечалось выше, при выполнении этой команды значение счетчика (IDENTITY) сбрасывается в начальное значение. Давайте проверим это утверждение в MS SQL Server. Для начала создадим таблицу с автоинкрементируемым столбцом, и добавим в нее три строки.
1. CREATE TABLE Truncate_test (id INT IDENTITY(5,5) PRIMARY KEY, val INT);
2. GO
3. INSERT INTO Truncate_test(val)
4. VALUES (1),(2),(3);
5. SELECT * FROM Truncate_test;
6. GO