Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие 3000555.doc
Скачиваний:
31
Добавлен:
30.04.2022
Размер:
19.12 Mб
Скачать

9.2.1. Агрегатные функции

Запросы могут производить обобщенное групповое значение полей точно также как и значение одного поля.

Это делается с помощью агрегатных функций.

Агрегатные функции производят одиночное значение для всей группы таблицы.

Для этого используются следующие функции:

  • COUNT - производит номера строк или не-NULL значения полей, которые выбрал запрос.

  • SUM - производит арифметическую сумму всех выбранных значений данного поля.

  • AVG - производит усреднение всех выбранных значений данного поля.

  • MAX - производит наибольшее из всех выбранных значений данного поля.

  • MIN - производит наименьшее из всех выбранных значений данного поля.

Агрегатные функции используются подобно именам полей в предложении SELECT запроса, но с одним исключением, они берут имена полей как аргументы.

Только числовые поля могут использоваться с функциями SUM и AVG.

А с функциями COUNT, MAX, и MIN, могут использоваться как числовые, так и символьные поля.

Когда функции MAX и MIN используются с символьными полями, упорядоченными в алфавитном порядке, то функция MIN будет означать первое, а функция MAX последнее значение в алфавитном порядке.

Предположим, что имеется таблица Pokypka, в которой имеется поле Cena (цена покупки).

Чтобы найти сумму (SUM) всех наших покупок, можно ввести следующий запрос:

SELECT SUM (CENA)

FROM Pokypka;

Чтобы подсчитать общее число строк в таблице Pokypka, в запросе используется функция COUNT со звездочкой вместо имени поля

SELECT COUNT (*)

FROM Pokypka;

До сих пор использовались агрегатные функции с одиночными полями как аргументами. Однако, можно использовать и агрегатные функции с аргументами, которые состоят из скалярных выражений, включающих одно или более полей.

Предположим, что наша таблица Pokypka имеет еще один столбец, который хранит предыдущий неуплаченный долг (поле Dolg) для каждого покупателя

Мы хотим найти наибольший текущий долг, добавлением суммы приобретений к предыдущему долгу. Найти наибольший неуплаченный долг можно, послав следующий запрос:

SELECT MAX (Dolg+ (Cena) )

FROM Pokypca;

Для каждой строки таблицы, этот запрос будет складывать значения Dolg и Cena для каждого покупателя и выбирать самое большое значение, которое он найдет.

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

Это дает возможность объединять поля и агрегатные функции в едином предложении SELECT.

Например, предположим, что в таблице Pokypca имеется поле с номерами продавцов (NumberP), и вы хотите найти наибольшую сумму приобретений, полученную каждым продавцом.

Можно сделать раздельный запрос для каждого из них, выбрав MAX (Cena) из таблицы Pokypca для каждого значения поля NumberP., Однако, GROUP BY позволит поместить их все в одну команду:

SELECT NumberP, MAX (Cena)

FROM Pokypca

GROUP BY NumberP;

Предположим, что в предыдущем примере, нужно увидеть только максимальную сумму приобретений, значение которой выше 500.00.

К сожалению, нельзя использовать агрегатную функцию в предложении WHERE, потому что предикаты в предложении WHERE оцениваются как одиночные строки, а агрегатные функции оцениваются как группы строк.

Чтобы увидеть максимальную стоимость приобретений свыше 500.00, нужно использовать предложение HAVING.

Предложение HAVING определяет критерии, используемые, чтобы удалять определенные группы из вывода, точно также как предложение WHERE делает это для индивидуальных строк.

Правильным запросом будет следующий:

SELECT NumberP, MAX (Cena)

FROM Pokypca

GROUP BY NumberP

HAVING MAX ((Cena)) > 500.00;

Аргументы в предложении HAVING следуют тем же самым правилам, что и в предложении SELECT, состоящим из команд, использующих GROUP BY. Они должны иметь одно значение на группу вывода.