Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторные работы_1430_1432_33_34.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
4.2 Mб
Скачать

Использование агрегатных функций в подзапросах.

Как видно из рассмотренного ранее лекционного материала, одним из видов функций, которые автоматически выдают в результате единственное значение для любого количества строк, являются агрегатные функции. Любой запрос, использующий единственную агрегатную функцию без предложения GROUP BY, дает в результате единственное значение для использования его в основном предикате (условии).

Например, если необходимо узнать про все заказы, стоимость которых превышает среднюю стоимость заказов за 4 октября 1990 г., то используя функцию AVG запрос будет выглядеть:

SELECT * FROM Orders

WHERE kol >

(SELECT AVG(kol)

FROM Orders

WHERE data=’04.10.90’);

Сгруппированные, то есть примененные с предложением GROUP BY, агрегатные функции могут дать в результате множество значений. Поэтому так их нельзя применять в подзапросах. Такие команды отвергаются в принципе, не смотря на то, что применение GROUP BY в некоторых случаях дает единственную группу в качестве выходных данных подзапроса. Для исключения ненужных групп следует применить единственную агрегатную функцию с предложением WHERE.

!!!!! То, что сейчас вы прочитали, может привести вас к выводу, что результатом подзапросов может быть только единственное значение, но в sql можно сформировать несколько строк, используя оператор IN.

Применение подзапросов, которые формируют множественные строки с помощью in.

Можно формулировать подзапросы, в результате выполнения которых получается любое количество строк, применяя специальный оператор IN. Операторы BETWEEN, LIKE, IS NULL в подзапросах применять нельзя. IN определяет множество значений, которые тестируются на совпадение с другими значениями для определения истинности предиката. Когда IN применяется в подзапросе, SQL просто строит это множество из выходных данных подзапроса. Например, найти все заявки для продавцов из Киева:

SELECT * FROM Orders

WHERE person_n IN

(SELECT person_n

FROM PRODAV

WHERE city=’Киев’;

Применять IN можно и для получения единственного значения, и там, где применим реляционный оператор сравнения. В отличии от реляционных операторов IN не не приводит к ошибке выполнения команды, когда в результате выполнения запроса получается не одно, а несколько значений выходных данных.

Примечание!

  1. Общая черта всех рассмотренных подзапросов состоит в том, что они выбирают единственный столбец. Это существенно, так как выходные данные вложенного SELECT – предложения сравниваются с единственным значением. Из этого следует, что вариант SELECT * нельзя использовать в подзапросе. Исключением из этого правила являются подзапросы с оператором EXISTS, который рассмотри позднее.

  2. В предложении подзапроса SELECT можно использовать выражения, основанные на столбцах, а не сами столбцы. Это можно сделать, применяя операторы отношения или IN. Например, следующий запрос использует оператор отношения = :

SELECT * FROM Pokypat

WHERE ynik_n =

(SELECT person_n + 1000

FROM Prodav

WHERE comm > 0.2);

Данный запрос находит всех покупателей, для которых работают продавцы, персональный номер которых начинается с 1001 и комиссионные которых больше 0,20.