Ответ
Да, использовать HAVING без GROUP BY синтаксически допустимо, но при этом запрос рассматривает весь набор результатов как одну агрегированную группу.
Механика работы
- Без
GROUP BYагрегатные функции (например,COUNT(),SUM()) применяются ко всей таблице, возвращая одно итоговое значение. - Предложение
HAVINGзатем фильтрует это единственное агрегированное значение.
Практический пример
-- Сколько всего заказов в таблице? Отобразить, только если их больше 100.
SELECT COUNT(*) AS total_orders
FROM orders
HAVING COUNT(*) > 100;
Этот запрос вернет одну строку с total_orders, только если общее количество заказов превышает 100. В противном случае результат будет пустым.
Сравнение с WHERE
WHEREфильтрует строки до агрегации.HAVINGфильтрует результаты после агрегации.
Когда это полезно? Такой паттерн используется редко, но может быть удобен для проверки глобальных условий перед возвратом агрегированного результата, например, в подзапросах или CTE (Common Table Expressions). В большинстве же случаев HAVING используется в паре с GROUP BY для фильтрации групп.