Как работает предложение HAVING в SQL при отсутствии GROUP BY?

«Как работает предложение HAVING в SQL при отсутствии GROUP BY?» — вопрос из категории Базы данных и SQL, который задают на 10% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, использовать HAVING без GROUP BY синтаксически допустимо, но при этом запрос рассматривает весь набор результатов как одну агрегированную группу.

Механика работы

  1. Без GROUP BY агрегатные функции (например, COUNT(), SUM()) применяются ко всей таблице, возвращая одно итоговое значение.
  2. Предложение 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 для фильтрации групп.