Ответ
Оператор 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.