Короткий ответ
Агрегатные функции — COUNT, SUM, AVG, MIN, MAX — выполняют вычисления над набором значений и возвращают одно итоговое. GROUP BY группирует записи с одинаковыми данными по одному или нескольким столбцам и применяется вместе с агрегатами. WHERE фильтрует строки до группировки, а HAVING — группы после агрегации.
Как это работает подробнее
Разница WHERE и HAVING — в этапе фильтрации: обе клаузы могут встретиться в одном запросе, потому что работают на разных стадиях обработки.
- Этап WHERE. Фильтрует отдельные записи до группировки по конкретным условиям и не может фильтровать агрегированные значения.
- Этап GROUP BY. Собирает записи с одинаковыми значениями по выбранным столбцам.
- Этап агрегации. Агрегатная функция, например
COUNT(studentId), вычисляет значение для каждой группы. - Этап HAVING. Накладывает условие на результат агрегатных функций, например
HAVING COUNT(*) > 5. - Совместная работа. WHERE исключает ненужные строки до группировки, а HAVING отбрасывает неподходящие группы после неё.
Пример кода
Подсчёт студентов по странам
SELECT COUNT(studentId), country
FROM myDB.students
WHERE country != 'INDIA'
GROUP BY country
HAVING COUNT(studentID) > 5;Что использовать на практике
- Сводные отчёты. Для подсчётов по группам используй GROUP BY вместе с агрегатной функцией.
- Фильтр до агрегации. Условия на отдельные строки ставь в WHERE — это уменьшает объём данных для группировки.
- Фильтр после агрегации. Условия на агрегированные значения записывай только в HAVING.
Подводные камни
- Агрегат в WHERE. Попытка записать условие на агрегат через WHERE приводит к ошибке — нужен HAVING.
- Колонки без GROUP BY. Выборка неагрегированных столбцов вне GROUP BY ведёт себя непредсказуемо во многих СУБД.
- GROUP BY без агрегата. Без агрегатной функции группировка не даёт осмысленного сводного результата.
Как отвечать на собеседовании
- Определи агрегатные функции и GROUP BY → объясни порядок выполнения: WHERE работает до группировки, HAVING — после → разбери пример с COUNT и HAVING → подчеркни, что обе клаузы могут работать в одном запросе.