Группировка и агрегатные функции
Агрегатные функции могут вычисляться как по всей таблице, так и по отдельным группам строк, в последнем случае над таблицей выполняется операция группировки.
При группировке формируются группы с одинаковыми значениями в столбце группировки (или нескольких столбцах), запрос возвращает столько строк, сколько получилось групп. Фактически, количество групп совпадает с количеством уникальных значений в столбце группировки, поэтому группировку принято выполнять по столбцам, содержащим большое количество повторяющихся значений. Тогда количество групп будет значительно меньше, чем количество строк в таблице.
В базе данных, которую мы используем для демонстрационных примеров, наиболее подходящей для группировки является таблица оценок marks, в которой каждый столбец содержит большое количество повторяющихся значений и может быть использован в качестве столбца группировки.
Например, сгруппировав эту таблицу по столбцу cod_st, можно подсчитать различные итоговые данные по каждому студенту. Так, запрос:
Select cod_st, avg(mark) avg_mark, count(mark) count_mark
from marks
GROUP BY cod_st
возвращает средний балл и количество оценок для каждого студента. Вместе с итоговыми данными запрос возвращает коды студентов, для которых подсчитаны итоговые данные. Вывод столбца cod_st в приведенном запросе может быть выполнен корректно, поскольку при выполнении группировки в каждой группе оказались одинаковые коды студентов (но разные предметы и разные оценки).
Если выполнить группировку таблицы marks по столбцу cod_sub (код предмета), то можно подсчитать те же итоговые данные по каждому предмету. Но тогда в список вывода запроса, кроме агрегатных функций, можно включить только код предмета.
Select cod_sub, avg(mark) avg_mark, count(mark) count_mark
from marks
GROUP BY cod_sub
Обобщив примеры, выведем общее правило для запросов с группировкой:
в списке выражений, который следует за словом SELECT, могут быть только выражения из фразы group by и агрегатные функции(или выражения на их основе).
Дата добавления: 2015-08-26; просмотров: 1012;