Во всех предыдущих примерах, подзапросы использовались в контексте оператора SELECT. Однако подзапросы могут также использоваться в операторах UPDATE и DELETE.
Это можно показать на простом примере. Предположим, что необходимо удалить все филиалы, пользующиеся услугой "Recruitment" (идентификатор услуги 2). Сначала в таблице branches_services просматриваются все филиалы, пользующиеся этой услугой.
Подзапросы и другие операторы ЯМД
Убирая все лишнее
MySQL гораздо лучше оптимизирует работу объединений, чем подзапросов. По­этому, обнаружив, что ваш сервер MySQL сильно перегружен, проверьте исходные тексты своего приложения и попробуйте заменить подзапросы объединениями или последовательностью объединений.
И удалите записи о соответствующих филиалах из таблицы branches. 
Листинг 11.42.
mysql> DELETE FROM branches WHERE bid = 1011;
Query OK, 1 row affected (0.00 sec)
mysql> DELETE FROM branches WHERE bid = 1031;
Query OK, 1 row affected (0.00 sec)
С помощью подзапроса эти две операции можно объединить в одну.
Листинг 11.43.
mysql> DELETE FROM branches WHERE bid IN (SELECT bid FROM
branches_services WHERE sid = 2);
Query OK, 2 rows affected (0.00 sec)
А как удалить всех заказчиков, один из филиалов которых дает доход не более 500 долл. в месяц?
Листинг 11.44.
mysql> DELETE FROM clients WHERE cid IN (SELECT DISTINCT b.cid FROM
branches AS b, branches_services AS bs, services AS s WHERE b.bid = bs.bid AND bs.sid = s.sid GROUP BY bs.bid HAVING SUM(sfee) <= 500);
Query OK, 1 row affected (0.28 sec)
В этом случае внутренний запрос сгруппирует различные филиалы по идентифика­тору филиала, вычислит суммарный доход каждого филиала по всем услугам, и перечис­лит филиалы, доходы от которых не превышают 500 долл. Соответствующие идентифи­каторы заказчиков используются внешним запросом для выполнения операции DELETE в таблице clients.
Аналогичным образом подзапросы могут использоваться и в операторе UPDATE. Предположим, что необходимо определить, какими услугами пользуются не менее чем в трех филиалах.
Подзапросы и другие операторы ЯМД
С помощью подзапроса две предыдущие операции можно объединить в одну. Листинг 11.47.
mysql> UPDATE services SET sfee = sfee + (sfee * 0.25) WHERE sid IN (SELECT sid FROM branches_services GROUP BY sid HAVING COUNT (bid) >=
3);
Query OK, 3 rows affected (0.22 sec) Rows matched: 3 Changed: 3 Warnings: 0
Обратимся к другому примеру. Предположим, что надо заменить всем филиалам из Калифорнии услугу "Administration" на услугу "Security". С помощью подзапроса это сделать проще простого!
Листинг 11.48.
mysql> UPDATE branches_services SET sid = 6 WHERE sid = 4 AND bid IN
(SELECT bid FROM branches WHERE bloc = 'CA');
Query OK, 2 rows affected (0.00 sec) Rows matched: 2 Changed: 2 Warnings: 0
В этом случае внутренний запрос выбирает только те идентификаторы филиалов, ко­торые географически размещены в Калифорнии, и передает полученный результат внешнему запросу, который обновляет соответствующие записи в таблице branches_services. Обратите внимание, каким образом определяется критерий вы­борки модифицируемых строк: внутренний запрос выбирает все записи, касающиеся Ка­лифорнии, а внешний - те, что касаются филиалов, которые пользуются только услугой "Administration".
При желании задачу можно еще больше усложнить, добавив подзапросы в различные предложения SET, - это совершенно допустимый с точки зрения синтаксиса запрос SQL, и работает он аналогично подзапросам в предложении WHERE.
Листинг 11.49.
mysql> UPDATE branches_services SET sid = (SELECT sid FROM services WHERE sname = 'Security') WHERE sid = (SELECT sid FROM services WHERE sname =
'Administration') AND bid IN (SELECT bid FROM branches WHERE bloc = 'CA');
Query OK, 2 rows affected (0.00 sec) Rows matched: 2 Changed: 2 Warnings: 0