Подзапросы можно использовать самыми различными способами:
■ в предложениях WHERE или HAVING;
■ в операторах сравнения или логических операторах;
■ с тестами принадлежности IN;
■ с логическими проверками EXISTS;
■ в предложении FROM;
■ с объединениями;
■ с запросами UPDATE и DELETE.
Рассмотрим эти вопросы подробнее в следующих разделах.
Подзапросы и предложение where/having
MySQL позволяет включать подзапросы в предложения WHERE (для ограничения записей, возвращенных включающей конструкцией SELECT ... WHERE) или предложения HAVING (для ограничения групп, созданных включающим SELECT ... GROUP BY). Подзапросы, заключенные в скобки, могут обрабатываться операторами сравнения и логическими операторами, в составе операторов IN или EXISTS.
Подзапросы и операторы сравнения
Когда подзапрос дает одно единственное значение, для сравнения его в условном выражении, заданном в предложении WHERE или HAVING внешнего запроса, можно использовать операторы сравнения MySQL. Например, нам необходим перечень всех заказчиков, у которых есть два филиала. Сначала потребуется определить, сколько филиалов имеют заказчики,
В этом случае сначала обрабатывается внутренний запрос, в результате чего филиалы группируются по идентификатору заказчика и определяется количество записей (филиалов) для каждой группы. А количество заказчиков, которые имеют по два филиала, можно определить, просто отфильтровав данные предложением HAVING, и соответствующий идентификатор заказчика будет возвращен в главный запрос. После этого идентификаторы передаются таблице customers, которая передает соответствующее наименование заказчика.
А как можно выбрать тех заказчиков, которые пользуются самыми дорогостоящими услугами?
Для получения наименования филиала и наименования заказчика вполне целесообразно прибегнуть к внутреннему объединению, которое работает достаточно быстро.
Или можно воспользоваться подзапросом для получения списка филиалов, которые пользуются всеми имеющимися в наличии услугами, что видно из следующего примера.
Листинг 11.15.
mysql> SELECT branches.bid, COUNT (sid) FROM branches, branches_services WHERE branches.bid = branches_services.bid GROUP BY branches.bid HAVING COUNT (sid) = (SELECT COUNT(*) FROM services);
Empty set (0.04 sec)
Достаточно беглого взгляда на исходные данные, чтобы определить, что нет филиалов, которые бы пользовались всеми предоставляемыми услугами. Что же касается определения заказчиков, все филиалы которых пользовались бы всеми услугами, то это можно сделать с помощью следующего запроса.
Подзапросы и оператор IN
Операторы сравнения можно применять только тогда, когда подзапрос возвращает результирующий набор, состоящий из одного значения. Однако в том случае, когда результирующий набор, возвращенный подзапросом, содержит сразу несколько значений, операторы сравнения заменяются оператором IN.
Оператор IN позволяет проверять наличие определенного значения в результирующем наборе и выполнить внешний запрос, если проверка прошла успешно. Для того чтобы продемонстрировать это, просмотрим перечень всех услуг, которыми пользуются определенные филиалы (скажем, филиал с идентификатором 1031). Для этого необходимо получить список идентификаторов всех услуг, которые используются в этом филиале.
В этом случае MySQL произведет выборку только тех записей таблицы services, которые соответствуют набору идентификаторов услуг, возвращенных подзапросом.
Как вариант этого запроса можно получить список всех филиалов, пользующихся услугой "Accounting" (идентификатор услуги 1).
Ммм-да ... не очень-то информативно. Совсем не помешает наименование заказчика для каждого филиала. Оно определеяется с помощью быстрого объединения.
Предположим, нам необходим список особо ценных клиентов, ежемесячный счет отдельных филиалов которых составляет не менее 2 тыс. долл. Эту информацию можно
получить (хотя есть и другие способы), воспользовавшись подзапросом с объединением, предложением GROUP BY и оператором IN.
ТОП-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. Подзапросы | Все о MySQL. Подзапросы и оператор exists |