Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
BD-2007-0.doc
Скачиваний:
4
Добавлен:
01.03.2025
Размер:
2.68 Mб
Скачать

7.6.3. Применение агрегатных функций и вложенных запросов в операторе выбора

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

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

Это делается с помощью агрегатных функций. Агрегатные функции вычисляют одиночное значение для всей группы таблицы. Список этих функций представлен в таблице 5.7.

Таблица 5.7. Агрегатные функции

Функция

Результат

COUNT

Количество строк или непустых значений полей, которые выбрал запрос

SUM

Сумма всех выбранных значений данного поля

AVG

Среднеарифметическое значение всех выбранных значений данного поля

MIN

Наименьшее из всех выбранных значений данного поля

MAХ

Наибольшее из всех выбранных значений данного поля

Агрегатные функции используются подобно именам полей в операторе SELECT, но с одним исключением: они берут имя поля как аргумент. С функциями SUM и AVG могут использоваться только числовые поля. С остальными функциями могут использоваться как числовые, так и символьные поля. (При использовании с символьными полями функции MAX и MIN будут транслировать их в эквивалент ASCII-кода и обрабатывать в алфавитном порядке).

Ниже приведен пример запроса с группировкой по полю Дисциплина с выводом в качестве результата названия дисциплины и количества строк в группе по данной дисциплине:

SELECT R1.Дисциплина, COUNT(*)

FROM R1

GROUP BY R1.Дисциплина;

Результат

Дисциплина

COUNT(*)

Базы данных

6

Теория информации

4

Сети и телекоммуникации

3

Английский язык

4

Если надо сосчитать количество студентов, сдавших экзамен по каждой дисциплине, надо исключить из расчетов неопределенные значения (в данном примере студента Миронова А.В., не сдавшего дисциплину Теория информации). Запрос будет выглядеть следующим образом:

SELECT R1.Дисциплина, COUNT(*)

FROM R1

WHERE R1.Оценка IS NOT NULL

GROUP BY R1.Дисциплина;

Результат

Дисциплина

COUNT(*)

Базы данных

6

Теория информации

3

Сети и телекоммуникации

3

Английский язык

4

Если требуется определить данные для всего исходного отношения, то можно применить агрегатные функции без предварительной группировки. В этом случае все отношение рассматривается как одна группа (предложение GROUP BY… в этом случае и не требуется).

Пример.

Определить количество успешно сданных экзаменов.

SELECT COUNT(*)

FROM R1

WHERE R1.Оценка > 2;

Возвращается одно единственное значение независимо от количества строк в таблице.

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

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

Агрегатные функции могут применяться:

  • как в выражении вывода результатов строки SELECT,

  • так и в выражении условия обработки сформированных групп HAVING.

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

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

SELECT R2.Группа

FROM R1, R2

WHERE R1.ФИО = R2.ФИО AND R1.Оценка = 2

GROUP BY R2.Группа, R1.Дисциплина

HAVING COUNT(*)>1;

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]