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

6.5. Агрегатные (групповые) функции.

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

Имеются следующие агрегатные (т. е. применяемые к целой группе кортежей) функции:

COUNT – количество непустых значений поля в группе;

COUNT(*) – количество строк в группе;

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

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

MIN, MAX – минимум и максимум поля в группе.

Функции используются как имена полей в SELECT, но имя поля – аргумент агрегатной функции.

1. Сколько экзаменов было успешно сдано?

SELECT COUNT(*) FROM R1 WHERE O > 2

Здесь операция группировки не применена. Это означает, что все отношение – одна группа.

2. Количество студентов, сдававших экзамен по каждой дисциплине:

SELECT R1.D, COUNT(*) FROM R1 GROUP BY R1.D

Для удаления дублей при группировке следует использовать DISTINCT.

3. Количество студентов в каждой группе:

SELECT COUNT(DISTINCT R2.FIO), R2.G

FROM R2 GROUP BY R2.G

Иногда удобно или необходимо переименовать атрибуты, входящие в выражение SELECT. Это достигается использованием выражения AS <синоним имени поля>.

4. Количество студентов в каждой группе:

SELECT COUNT(DISTINCT R2.FIO) AS KOL_VO, R2.G

FROM R2 GROUP BY R2.G

5. Количество студентов, сдавших экзамен по каждой дисциплине:

SELECT R1.D, COUNT(*) FROM R1

WHERE R1.O IS NOT NULL

GROUP BY R1.D

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

6. Сколько разных оценок получено по каждой дисциплине?

SELECT R1.D, COUNT(DISTINCT R1.O) FROM R1

WHERE R1.O IS NOT NULL

GROUP BY R1.D

7. Для каждой группы, дисциплины – средняя оценка и количество студентов, успешно сдавших экзамен:

SELECT R2.G, R1.D, COUNT(*), AVR(O) FROM R1, R2

WHERE R1.FIO = R2.FIO AND R1.O IS NOT NULL AND R1.O > 2

GROUP BY R2.G, R1.D

Агрегатные функции не могут быть использованы в разделе WHERE, т.к. предикат WHERE применим только для одной строки, а агрегат – для группы строк. Однако можно наложить условие и на агрегат – для этого служит предикат HAVING. В разделе HAVING можно задать условие на группируемый атрибут, либо на результат группировки.

8. Группы, в которых по одной дисциплине получено более одной двойки:

SELECT R2.G FROM R1, R2 WHERE R1.FIO = R2.FIO AND R1.O = 2

GROUP BY R2.G, R1.D

HAVING COUNT(*) > 1