Удаление записей

Для удаления записей из таблицы используется оператор DELETE.

Его синтаксис:

DELETE FROM target [[AS] alias]
    [WHERE {search-conditions | CURRENT OF cursorname}]
    [ORDER BY sort_items]
    [ROWS m [TO n]]
    [RETURNING <returning_list> [INTO <variables>]]

Фильтрация

Условие в предложении WHERE ограничивает набор удаляемых строк. Удаляются только те строки, которые удовлетворяют условию поиска, или только текущей строке именованного курсора. Удаление с помощью WHERE CURRENT OF называется позиционированным удалением, потому что удаляется запись в текущей позиции. Удаление при помощи «WHERE условие» называется поисковым удалением поскольку СУБД ищет записи, соответствующие условию.

Например,

DELETE FROM People WHERE first_name <> 'Boris' AND last_name <> 'Johnson';

DELETE FROM employee e WHERE NOT EXISTS(
    SELECT * FROM employee_project ep WHERE e.emp_no = ep.emp_no);

DELETE FROM Cities WHERE CURRENT OF Cur_Cities; -- только в PSQL

Сортировка и ограничения

Предложение ORDER BY упорядочивает набор перед его удалением. Что может быть важно в некоторых случаях.

Предложение ROWS позволяет ограничить количество удаляемых строк. Имеет смысл только в комбинации с предложением ORDER BY, но допустимо и без него.

Примеры:

Удаление самой старой покупки

DELETE FROM Purchases ORDER BY ByDate ROWS 1

Удаление заказов для 10 клиентов с самыми большими номерами

DELETE FROM Sales ORDER BY custno DESC ROWS 1 TO 10

Удаляет все записи из sales, поскольку не указано ROWS

DELETE FROM Sales ORDER BY custno DESC

Удаляет одну запись «с конца», т.е. от Z…

DELETE FROM popgroups ORDER BY name DESC ROWS 1

Удаляет пять самых старых групп

DELETE FROM popgroups ORDER BY formed ROWS 5

Сортировка (ORDER BY) не указана, поэтому будут удалены 8 обнаруженных записей, начиная с пятой.

DELETE FROM popgroups ROWS 5 TO 12

RETURNING

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

Примеры:

DELETE FROM Scholars WHERE first_name = 'Henry' AND last_name = 'Higgins'
    RETURNING last_name, fullname, id;
DELETE FROM Dumbbells ORDER BY iq DESC ROWS 1 RETURNING last_name, iq INTO :lname, :iq;
DELETE FRMO TempSales ts WHERE ts.id = tempid RETURNING ts.qty INTO new.qty;