Зачем в SQL-запросе с агрегатными функциями нужен оператор GROUP BY?

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

Ответ

GROUP BY группирует строки с одинаковыми значениями в указанных столбцах, чтобы агрегатные функции (SUM, AVG, COUNT, MAX, MIN) применялись к каждой группе отдельно, а не ко всей таблице как к одному целому.

Почему это необходимо? Без GROUP BY неагрегированные столбцы в SELECT приводят к неоднозначности или ошибке, так как СУБД не знает, какое значение из группы строк вернуть для этого столбца.

Пример ошибки (без GROUP BY):

-- Этот запрос вызовет ошибку в большинстве СУБД
SELECT department, COUNT(*)
FROM employees;
-- Ошибка: столбец 'department' должен быть в GROUP BY или агрегатной функции.

Корректный пример (с GROUP BY):

-- Подсчет сотрудников в каждом отделе
SELECT department, COUNT(*) as employee_count
FROM employees
GROUP BY department;

Ключевые правила:

  1. Все столбцы в SELECT, не являющиеся аргументами агрегатных функций, должны быть перечислены в GROUP BY.
  2. GROUP BY выполняется после WHERE (фильтрации строк) и перед HAVING (фильтрации групп) и ORDER BY (сортировки результата).