Можно ли использовать HAVING без GROUP BY в SQL?

«Можно ли использовать HAVING без GROUP BY в SQL?» — вопрос из категории Базы данных, который задают на 28% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, можно, но это имеет специфическое применение и зависит от СУБД.

Техническая суть:

  • Без GROUP BY весь набор результатов запроса трактуется как одна агрегированная группа.
  • Предложение HAVING в этом случае фильтрует результат по агрегатным функциям, применённым ко всей таблице.

Пример (стандартный SQL):

SELECT COUNT(*) AS total_employees, AVG(salary) AS avg_salary
FROM employees
HAVING COUNT(*) > 100 AND AVG(salary) < 50000;

Этот запрос вернёт одну строку с общим числом сотрудников и средней зарплатой, но только если оба условия выполняются для всей таблицы.

Важные нюансы:

  1. Без агрегатных функций использование HAVING бессмысленно — для фильтрации неагрегированных строк всегда используйте WHERE.
  2. Поддержка СУБД: Стандарт SQL требует GROUP BY для HAVING. Однако многие СУБД (MySQL, PostgreSQL) допускают такой синтаксис. В SQL Server это вызовет ошибку.
  3. Практическое применение: Основной сценарий — фильтрация результатов агрегации по всей таблице, когда группировка не требуется. Например, проверка глобальных метрик перед выполнением дальнейших действий в скрипте.

Лучшая практика: Для ясности кода, даже если ваша СУБД разрешает HAVING без GROUP BY, рассмотрите использование вложенного запроса:

SELECT * FROM (
    SELECT COUNT(*) AS cnt FROM employees
) AS subquery
WHERE cnt > 100;