Для чего используется оператор GROUP BY без HAVING в SQL?

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

Ответ

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

Ключевое отличие: HAVING фильтрует уже сгруппированные результаты (группы), а WHERE фильтрует исходные строки до группировки.

Пример: подсчет сотрудников в каждом отделе

SELECT
    department_id,
    COUNT(*) AS employee_count, -- Агрегатная функция для каждой группы
    AVG(salary) AS avg_salary
FROM employees
WHERE status = 'ACTIVE' -- Фильтрация строк ДО группировки
GROUP BY department_id; -- Группировка по столбцу
-- HAVING не нужен, так как мы не отфильтровываем группы по условию.
Результат: department_id employee_count avg_salary
10 5 75000
20 3 82000

Когда GROUP BY используется без HAVING:

  • Когда требуется просто получить сводную статистику по группам.
  • Когда фильтрация групп не требуется. Если бы нам нужны были только отделы с более чем 4 сотрудниками, мы бы добавили HAVING COUNT(*) > 4.

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