ТОП-10 популярных


НОУТБУК с блестящим экраном
Eсли выпустившая ноутбук фирма предлагает его в качестве «замены настольному ПК», то это должно подразумевать под собой нечто большее, чем...


Для работы с вещественными числами в MySQL предусмотрено три типа данных - это типы FLOAT, DOUBLE, DECIMAL. Числовой тип FLOAT...

Магнито-оптический дисковод DynaMO
Cейчас, когда традиционные флоппи-дисководы на долгие годы замерли в своем развитии, поиск альтернативных носителей продолжается, и ситуация, казалось бы, разрешилась...

БОЛЬШЕ БОЛЬШИХ LCD-мониторов
Процесс вытеснения с рынка мониторов с электронно-лучевой трубкой (CRT) продолжается. О смещении акцентов в пользу LCD-мониторов теперь заявляют даже те...

Больше больших LCD-мониторов
Процесс вытеснения с рынка мониторов с электронно-лучевой трубкой (CRT) продолжается. О смещении акцентов в пользу LCD-мониторов теперь заявляют даже те...


Какую только информацию мы не помещаем на компакт-диски: резервные копии важных данных, музыку, фильмы... Многие полагают, что главное - «купить...

Иди и пиши. TravelMate C100
Планшетный компьютер платформы Tablet PC обязан в первую очередь быть легким, способным достаточно долго работать без подзарядки батарей. Эти требования...

Размер объему не помеха.
С тех пор как компания Fujitsu отказалась от производства жестких дисков для настольных компьютеров, многие пользователи начали забывать о том,...

ПОД ЛИТЕРОЙ «N»
Aтаку LCD-мониторов не остановить, а масштабы этого наступления даже немного пугают. Судите сами — многие пользователи только начинают приглядываться к новому для...

Internet2, или cтарые песни о новом
Когда-то на заре Интернета, тогдаеще военно-научной сетиAPRAnet, были заложены основныепринципы функционирования«Сети сетей». В их числе — использованиепротокола, называемого сейчасIPv4. В...

Все о MySQL. Подзапросы и другие операторы ЯМД


28-12-2009

Во всех предыдущих примерах, подзапросы использовались в контексте оператора 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

Понравился материал? Поделитесь с друзьями!



<< Предыдущая статьяСледующая статья >>
Все о MySQL. Подзапросы и предложение from Все о MySQL. Циклические ссылки в операторах update и delete