Материал: Graber_Martin_-_SQL_dlya_prostykh_smertnykh_-_2014

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Глава 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

Источник: https://studfile.net/preview/16418473/