'WHERE': сначала выбирает строки -> группирует строки-> вычисляет агрегатные функции.
То есть, грубо говоря, с помощью 'WHERE' мы выбираем строки для вычисления агрегатов
'HAVING': сначала группирует строки -> вычисляет агрегатные функции -> выбирает строки.
HAVING используется для фильтрации результата GROUP BY по заданным логическим условиям
Вывод:
'WHERE':
- не должно содержать агрегатных функций
- не имеет смысла использовать агрегатные функции для определения строк для вычисления агрегатных функций
'HAVING':
- всегда содержит агрегатные функции
В то же время 'HAVING' можно написать без агрегатов, но скорее всего это будет бесполезно. То же самое условие может быть более эффективным на стадии 'WHERE'.