Ответ
Оператор GROUP BY и агрегирующие функции неразрывно связаны: GROUP BY группирует строки по значениям указанных столбцов, а агрегирующие функции вычисляют итоговое значение для каждой образовавшейся группы.
Без GROUP BY агрегирующая функция применяется ко всем строкам результирующего набора как к одной группе.
С GROUP BY — вычисление происходит внутри каждой отдельной группы.
Основные агрегирующие функции: COUNT(), SUM(), AVG(), MIN(), MAX().
Правило проекции: В блоке SELECT запроса с GROUP BY можно указывать только:
- Столбцы, перечисленные в
GROUP BY. - Агрегирующие функции от любых столбцов.
Пример:
-- Считаем количество сотрудников и среднюю зарплату в каждом отделе
SELECT
department_id AS dept,
COUNT(*) AS employee_count, -- Агрегация по группе
AVG(salary) AS average_salary -- Агрегация по группе
FROM employees
WHERE hire_date > '2020-01-01' -- Фильтрация строк ДО группировки
GROUP BY department_id -- Группировка по отделу
HAVING COUNT(*) > 5; -- Фильтрация групп ПОСЛЕ группировки
Ключевые отличия:
WHERE— фильтрует строки до группировки.HAVING— фильтрует уже сформированные группы после агрегации.