Как агрегирующие функции связаны с оператором GROUP BY в SQL?

«Как агрегирующие функции связаны с оператором GROUP BY в SQL?» — вопрос из категории Базы данных, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Оператор GROUP BY и агрегирующие функции неразрывно связаны: GROUP BY группирует строки по значениям указанных столбцов, а агрегирующие функции вычисляют итоговое значение для каждой образовавшейся группы.

Без GROUP BY агрегирующая функция применяется ко всем строкам результирующего набора как к одной группе. С GROUP BY — вычисление происходит внутри каждой отдельной группы.

Основные агрегирующие функции: COUNT(), SUM(), AVG(), MIN(), MAX().

Правило проекции: В блоке SELECT запроса с GROUP BY можно указывать только:

  1. Столбцы, перечисленные в GROUP BY.
  2. Агрегирующие функции от любых столбцов.

Пример:

-- Считаем количество сотрудников и среднюю зарплату в каждом отделе
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 — фильтрует уже сформированные группы после агрегации.