Глава 1О. ВлоJкение заllросов
прос, рассмотренный в данном примере, вероятно, не очень полезен, если только не
предполагается, что поля snum и cnum имеют значение, отличное от того, что просто
служат первичными ключами. Но все это не проясняет сути дела.
Подзапросы с HAVING
Подзапросы можно применять также внутри предложения HAVING. В самих таких подзапросах можно использовать их собственные агрегатные функции, если они не дают множества значений, а также GROUP ВУ или HAVING. Например (выходные данные представлены на рис. 10.7):
SELECT rating, COUNT (DISTINCT cnum)
FROM Customers
GROUP ВУ rating
HAVING rating >
(SELECT AVG (rating)
FROM Customers
WHERE city = 'San Jose');
Эта команда подсчитывает количество покупателей с рейтингом, превышающим
Рис. 10. 7. Поиск покупателей (customers) с рейтингом (raiting), превышающим среднее значение
для San Jose
среднее значение для покупателей города San Jose. Если бы были другие рейтинги, от-
104
Итоги
личные от указанного значения 300, то каждое отдельное значение рейтинга выводи лось бы вместе с указанием числа покупателей, имеющих такой рейтинг.
Итоги
Теперь вы можете применять запросы в иерархическом порядке и знаете, насколь
ко использование выходных данных одного запроса для у.правления другим облегчает
выполнение многих действий, как можно использовать подзапросы с операторами от
ношения, а также со специальным оператором IN в предложении WHERE или
HAVING внешнего запроса.
Далее будет продолжен анализ подзапросов. В следующей главе рассматриваются
подзапросы, выполняемые отдельно для каждой строки, определенной во внешнем за
просе. В главах 12 и 13 вводится несколько специальных операторов, действующих, как и IN, на весь подзапрос, за исключением тех случаев, когда они применяются ис
ключительно к подзапросам.
105
Работаем на SQL
1.Запишите запрос, который использует подзапрос для получения всех заказов по купателя с именем Cisneros. Предположим, что его персональный номер неизвес
тен.
2.Запишите запрос, который выдает имена и рейтинги всех тех покупателей, кото рые сделали больше среднего числа заказов.
3.Запишите запрос, выбирающий сумму заказов каждого продавца, у которого она превышает наибольшее значение поля amount в таблице Orders.
(Ответы см. в приложении А.)
106
11
811811
Глава 11. Связа1111ые подзапросы
В данной главе вводятся подзапросы нового типа, которые не рассматривались
ранее, - связанные подзапросы. Вы сможете использовать их в предложениях запро
сов WHERE и HAVING. Мы рассмотрим сходство и различия между связанными за просами и соединениями (join), а также особенности алиасов и префиксов имен таблиц (когда они необходимы и как ими пользоваться).
Как формировать связанные подзапросы
Когда в SQL используются подзапросы, во внутреннем запросе (вложенном запросе) можно ссылаться на таблицу, имя которой указано в предложении FROM внешнего за проса, тем самым формируя связанный подзапрос (correlated subqиel}'). В этом случае подзапрос выполняется повторно, по одному разу для каждой строки таблицы из основ ного запроса. Связанные запросы относятся, из-за сложности их оценок, к числу наибо лее неясных понятий SQL. Однако, начав работать с ними, вы поймете, что они являются весьма мощным средством, так как могут выполнять очень сложные функции
при достаточно компактных командах.
Вот, например, один из способов отыскать всех покупателей, сделавших заказы 3 октября 1990 года (выходные данные представлены на рис. l l. l ):
SELECT •
FROM Customers outer
WHERE 10/03/1990 IN
(SELECT odate
FROM Orders inner
WHERE outer.cnum = inner.cnum);
Какработают. связанные подзапросы
В данном примере "inner" и "outer" являются алиасами, о которых шла речь в главе 9. Эти имена здесь выбраны для большей ясности (inner - внутренний, outer - внешний); они относятся к значениям внутреннего и внешнего запросов соответствен но. Поскольку значения в поле cnum внешнего запроса изменяются, внутренний за прос должен выполняться отдельно для каждой строки внешнего запроса. Строка
внешнего запроса, для которой выполняется внутренний запрос, называется текущей
строкой - кандидатом (current candidate 1·ои). Процедура выполнения связанного
подзапроса состоит в следующем:
l.Выбрать строку из таблицы, имя которой указано во внешнем запросе. Это теку
щая строка-кандидат.
108