Справка по SQL | страница 9



Существует несколько определенных правил выполнения агрегатных функций:

* Если в результате выполнения запроса не получено ни одной строки (или не одной строки для данной группы), то исходные данные для вычисления любой из агрегатных функций отсутствуют. В этом случае результатом выполнения функций COUNT будет нуль, а результатом всех других функций - NULL.

* Аргумент агрегатной функции не может сам содержать агрегатные функции (функция от функции). Т.е. в одном запросе нельзя, скажем, получить максимум средних значений.

* Результат выполнения функции COUNT есть целое число (INTEGER). Другие агрегатные функции наследуют типы данных обрабатываемых значений.

* Если при выполнении функции SUM был получен результат, превышающий максимальное значение используемого типа данных, возникает ошибка.

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

Фильтрация данных по итоговым показателям. Предложение HAVING



Если предложение WHERE определяет предикат для фильтрации строк, то предложение HAVING применяется после группировки для определения аналогичного предиката, фильтрующего группы по значениям агрегатных функций. Это предложение необходимо для проверки значений, которые получены с помощью агрегатной функции не из отдельных строк источника записей, определенного в предложении FROM, а из групп таких строк. Поэтому такая проверка не может содержаться в предложении WHERE.

Пример. Получить количество ПК и среднюю цену для каждой модели при условии, что средняя цена менее $800:


>SELECT model, COUNT(model) AS Qty_model, AVG(price) AS Avg_price

>FROM PC

>GROUP BY model

>HAVING AVG(price) < 800;


В результате выполнения запроса получим:


model

Qty_model

Avg_price

1232

4

425.0

1260

1

350.0


Заметим, что в предложении HAVING нельзя использовать псевдоним (Avg_price), используемый для именования значений агрегатной функции. Дело в том, что предложение SELECT, формирующее выходной набор запроса, выполняется предпоследним перед предложением ORDER BY.

Ниже приведен порядок обработки предложений в операторе SELECT:

* FROM

* WHERE

* GROUP BY

* HAVING

* SELECT

* ORDER BY

Этот порядок не соответствует синтаксическому порядку общего