Ответ
Да, можно, но это имеет специфическое применение и зависит от СУБД.
Техническая суть:
- Без
GROUP BYвесь набор результатов запроса трактуется как одна агрегированная группа. - Предложение
HAVINGв этом случае фильтрует результат по агрегатным функциям, применённым ко всей таблице.
Пример (стандартный SQL):
SELECT COUNT(*) AS total_employees, AVG(salary) AS avg_salary
FROM employees
HAVING COUNT(*) > 100 AND AVG(salary) < 50000;
Этот запрос вернёт одну строку с общим числом сотрудников и средней зарплатой, но только если оба условия выполняются для всей таблицы.
Важные нюансы:
- Без агрегатных функций использование
HAVINGбессмысленно — для фильтрации неагрегированных строк всегда используйтеWHERE. - Поддержка СУБД: Стандарт SQL требует
GROUP BYдляHAVING. Однако многие СУБД (MySQL, PostgreSQL) допускают такой синтаксис. В SQL Server это вызовет ошибку. - Практическое применение: Основной сценарий — фильтрация результатов агрегации по всей таблице, когда группировка не требуется. Например, проверка глобальных метрик перед выполнением дальнейших действий в скрипте.
Лучшая практика: Для ясности кода, даже если ваша СУБД разрешает HAVING без GROUP BY, рассмотрите использование вложенного запроса:
SELECT * FROM (
SELECT COUNT(*) AS cnt FROM employees
) AS subquery
WHERE cnt > 100;