Групповые функции (см. Приложение 3. Агрегатные функции) обрабатывают множество строк и возвращают, как правило, один результат на группу. По умолчанию все строки таблицы рассматриваются как одна группа. Для более детальной группировки строк используется предложение GROUP BY, которое делит строки на группы. В случае применения GROUP BY предложение SELECT должно содержать столбцы, идентифицирующие группы, остальные столбцы могут быть использованы в предложении Select только как аргументы агрегатных функций.
Пример 59
Задача.
Сформировать запрос для вывода наибольшей, наименьшей и средней оценки для каждого студента.
Решение.
SELECT P.NRecordBook [№ зачетки],
SName [Имя студента],
MAX(Mark) [Максимальная оценка],
MIN(Mark) [Минимальная оценка],
AVG(Mark)[Средняя оценка]
FROM Progress P INNER JOIN Student S
ON P.NRecordBook=S.NRecordBook
GROUP BY P.NRecordBook, SName
Результат реализации запроса:
Для каждой группы будет выведена только одна строка.
С предложением GROUP BY могут быть использованы все остальные команды SELECT, например, с помощью предложения WHERE можно исключить строки, которые не должны участвовать в запросе, допустим строки с признаком NULL. Рассмотрим это на примере применения агрегированной функции COUNT(). Функция COUNT() с аргументом отличным от *, игнорирует строки с признаком NULL, в то время как функция вида COUNT(*) посчитает все строки, в том числе и строки, в которых есть атрибуты с признаком NULL.
|
|
SELECT COUNT(*) [Количество оценок],
SUM(Mark)[Сумма баллов],
AVG(Mark)[Средняя оценка]
FROM Progress
Результат реализации запроса:
В этом случае функция COUNT() посчитает все строки, а функции SUM() и AVG() будут учитывать только те строки, в которых оценка NOT NULL.
SELECT COUNT(Mark) [Количество оценок],
SUM(Mark)[Сумма баллов],
AVG(Mark)[Средняя оценка]
FROM Progress
Результат реализации запроса:
Здесь функция COUNT() будет работать с теми же строками, что и функции SUM() и AVG(). Исключить возможные неоднозначности можно включив в запрос условие отбора строк: предложение WHERE mark Not NULL.
SELECT COUNT(*) [Количество оценок],
SUM(Mark)[Сумма баллов],
AVG(Mark)[Средняя оценка]
FROM Progress