Во всех предыдущих примерах, подзапросы использовались в контексте оператора 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
ТОП-10 популярных
Для работы с вещественными числами в MySQL предусмотрено три типа данных - это типы FLOAT, DOUBLE, DECIMAL. Числовой тип FLOAT...
БОЛЬШЕ БОЛЬШИХ LCD-мониторов
Процесс вытеснения с рынка мониторов с электронно-лучевой трубкой (CRT) продолжается. О смещении акцентов в пользу LCD-мониторов теперь заявляют даже те...
Процесс вытеснения с рынка мониторов с электронно-лучевой трубкой (CRT) продолжается. О смещении акцентов в пользу LCD-мониторов теперь заявляют даже те...
Больше больших LCD-мониторов
Процесс вытеснения с рынка мониторов с электронно-лучевой трубкой (CRT) продолжается. О смещении акцентов в пользу LCD-мониторов теперь заявляют даже те...
Процесс вытеснения с рынка мониторов с электронно-лучевой трубкой (CRT) продолжается. О смещении акцентов в пользу LCD-мониторов теперь заявляют даже те...
НОУТБУК с блестящим экраном
Eсли выпустившая ноутбук фирма предлагает его в качестве «замены настольному ПК», то это должно подразумевать под собой нечто большее, чем...
Eсли выпустившая ноутбук фирма предлагает его в качестве «замены настольному ПК», то это должно подразумевать под собой нечто большее, чем...
Иди и пиши. TravelMate C100
Планшетный компьютер платформы Tablet PC обязан в первую очередь быть легким, способным достаточно долго работать без подзарядки батарей. Эти требования...
Планшетный компьютер платформы Tablet PC обязан в первую очередь быть легким, способным достаточно долго работать без подзарядки батарей. Эти требования...
Магнито-оптический дисковод DynaMO
Cейчас, когда традиционные флоппи-дисководы на долгие годы замерли в своем развитии, поиск альтернативных носителей продолжается, и ситуация, казалось бы, разрешилась...
Cейчас, когда традиционные флоппи-дисководы на долгие годы замерли в своем развитии, поиск альтернативных носителей продолжается, и ситуация, казалось бы, разрешилась...
Компьютер для гурманов.«Эксимер ДМ»
Российская компания «Эксимер ДМ», известная как производитель настольных компьютеров, рабочих станций, серверов и ноутбуков, выступила техническим спонсором проведения торжеств, посвященных...
Российская компания «Эксимер ДМ», известная как производитель настольных компьютеров, рабочих станций, серверов и ноутбуков, выступила техническим спонсором проведения торжеств, посвященных...
Для длинных строк, т.е. строк длиннее 255 символов, в MySQL предусмотрены типы BLOB (Binary Large Object, большой двоичный объект) и...
В дополнение к календарным типам, предназначенным для хранения даты и времени отдельно, MySQL также поддерживает гибридные типы данных DATETIME и...
Вообще, к изменению настроек сервера прибегают очень редко. В MySQL программа заранее настроена так, чтобы соответствовать самым распространенным и основным...
Все о MySQL. Подзапросы и другие операторы ЯМД
28-12-2009
<< Предыдущая статья | Следующая статья >> |
Все о MySQL. Подзапросы и предложение from | Все о MySQL. Циклические ссылки в операторах update и delete |