Короткий ответ
Агрегатные функции — 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 — это уменьшает объём данных для группировки.