Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции БД.doc
Скачиваний:
94
Добавлен:
23.09.2019
Размер:
2 Мб
Скачать
☆

Функции агрегирования

Функции агрегирования возвращают единственное (скалярное) значение для группы кортежей. Всего различают пять таких функций:

  • COUNT – количество непустых строк или значений атрибутов, отличных от null, удовлетворяющих заданному условию;

  • SUM – сумма значений атрибута;

  • AVG – среднее значение атрибута;

  • MAX – максимальное значение атрибута;

  • MIN – минимальное значение атрибута.

В команде Select они используются в списке выбираемых полей наряду с именами атрибутов. Их аргументы – имена атрибутов, причем, для SUM и AVG допустимы аргументы только числового типа.

Рассмотрим подробнее функцию COUNT. Она подсчитывает количество всех непустых атрибутов, даже если их значение повторяется. Для исключения повторений используется вариант Distinct. Вариант COUNT(*) подсчитывает количество строк в выборке, включая и пустые, и повторяющиеся. Применять Distinct здесь нельзя. Вариант All позволяет считать все непустые значения атрибута, включая повторяющиеся.

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

Пример

Подсчитать количество продавцов, которые выполняли заказы:

Select COUNT(Distinct ном_прод) From Заказы;

Подсчитать количество продавцов:

Select COUNT(*) From Продавцы;

Подсчитать количество непустых сумм:

Select COUNT(All сумма) From Заказы;

Подсчитать общую сумму заказов в тысячах рублей:

Select SUM(сумма/1000) From Заказы;

Конец примера

Группировка

Нередко при работе с базой данных требуется выполнять какие-то действия с группой записей, объединенных общим свойством. Для этого существует возможность группировки, реализуемая фразой Group By. Записи группируются по одинаковым значениям указанного атрибута. Если при этом в запросе участвует агрегатная функция, она выполняется для каждой группы.

Пример

Выбрать наибольшие суммы заказов для каждого продавца:

Select MAX(сумма), ном_прод From Заказы

Group By ном_прод;

Сумма

Ном_прод

1900,1

14

5160,4

12

1098,1

17

1713,2

13

4723,0

11

Конец примера

Фраза Group By может содержать более одного атрибута, по которым группируются записи. В этом случае первый атрибут в списке определяет самую внешнюю группу, второй – группу внутри первой и т.п.

При работе с группами данных может возникнуть необходимость отбирать группы по какому-нибудь признаку, например, определить общие суммы заказов по дням и среди них отобрать те, которые превышают некоторое число. Если бы дело касалось записей, задача легко решалась бы фразой Where: …Where сумма >… . Но к группе она неприменима. Для отбора групп по некоторому признаку используется фраза Having.

Пример

Выбрать дни, в которые сумма заказов превышает 5000:

Select дата, Sum(сумма) From Заказы

Group By дата Having Sum(сумма)>5000;

Конец примера

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

Пример

Выбрать наибольшие заказы, выполняемые продавцами, номера которых 12 или17:

Select ном_прод, MAX(сумма) From Заказы

Group By ном_прод Having ном_прод in (12, 17);

Конец примера

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

Select дата, MAX(SUM(сумма)) From Заказы Group By дата;

Group By предполагает, что групп будет столько, сколько различных дат. С другой стороны, SUM(сумма) применяется к каждой группе, а MAX(SUM(сумма)) для всех групп выработает единственное значение, что противоречит предыдущему утверждению.