Результаты работы подзапроса вполне можно использовать и в предложении FROM внешнего оператора SELECT. Это можно проиллюстрировать на примере определения среднего количества услуг, которыми воспользовался каждый филиал. Поэтому сначала необходимо сгруппировать филиалы и вычислить среднее число услуг, которыми пользуются филиалы.
Таким образом, полученный подзапросом результат используется в предложении FROM внешнего запроса. Такая таблица на SQL-жаргоне называется производной таблицей.
Заметим, что при использовании результатов запросов, результирующая таблица, созданная внутренним запросом, должна иметь псевдоним, т.к. в противном случае MySQL не будет "знать", как ссылаться на ее столбцы. Если перезапустить предыдущий запрос без присвоения таблице псевдонима, получится следующее:
Листинг 11.31.
mysql> SELECT AVG(stotal) FROM (SELECT bid, COUNT (bid) AS stotal FROM branches_services GROUP BY bid);
ERROR 1246: Every derived table must have its own alias
А теперь пойдем дальше. Что делать, если вам необходимо перечислить филиалы, пользующиеся услугами, количество которых больше среднего?
Для того чтобы значительно ускорить работу этого запроса, целесообразно объединить предыдущие запросы в один сложный запрос.
Для определения наименований заказчиков, соответствующих этим филиалам, добавим еще один запрос (и объединение).
Подзапросы и объединения
Как было показано в примерах этой главы, подзапросы могут отлично "сосуществовать", но зачем ограничивать себя только внутренними объединениями? С подзапросами также хорошо работают любые типы объединений, и, применив творческий подход, можно добиться отличного взаимодействия между двумя типами запросов.
Так, например, с помощью левого объединения можно получить список заказчиков, у которых в таблице branches нет соответствующих записей.
В этом случае запрос сохранит все записи с левой стороны объединения (перечень заказчиков) и вставит значения NULL для всех записей справа (филиалы), которые не удовлетворяют условиям объединения. И что мы получим в результате? Все не имеющие филиалов заказчики будут иметь значение NULL (которое можно отбросить с помощью проверки IS NULL).
Это же можно сделать с помощью правого объединения с подзапросом.
В этом случае все записи на правой стороне объединения (клиенты) также будут присутствовать в результирующем наборе, а отсутствующие записи о филиалах будут обозначены как NULL. Подзапрос выведет соответствующий идентификатор клиента, по которому из таблицы customers можно будет получить наименование заказчика.
Интересен тот факт, что многие подзапросы могут быть представлены в виде объединений и наоборот. Рассмотрим следующий пример, в котором с помощью подзапроса выдается перечень офисов, пользующихся услугой "Recruitment".
Подзапрос можно представить самообъединением, а самообъединение подзапросом. Рассмотрим следующий пример, в котором с помощью подзапроса будет получен перечень всех филиалов, размещенных в том же штате, где находится штаб-квартира корпорации "JV Real Estate".
ТОП-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. Подзапросы и предложение from
28-12-2009
<< Предыдущая статья | Следующая статья >> |
Все о MySQL. Подзапросы и оператор exists | Все о MySQL. Подзапросы и другие операторы ЯМД |