Зачем нужна конструкция HAVING в SQL?

«Зачем нужна конструкция HAVING в SQL?» — вопрос из категории Базы данных, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Оператор HAVING в SQL служит для фильтрации результатов после выполнения агрегации с помощью GROUP BY. Это его фундаментальное отличие от WHERE, который фильтрует строки до группировки. В DevOps это часто используется при анализе логов, метрик или аудите данных.

Простое правило: WHERE работает с отдельными строками таблицы, а HAVING — с группами строк, созданными GROUP BY.

Практический пример из администрирования БД: Допустим, мы хотим найти пользователей (или сервисы), которые создали аномально высокую нагрузку на БД за последний час.

-- Найдем пользовательские сессии с более чем 1000 медленных запросов за час
SELECT
    user_host, -- Группируем по пользователю/хосту
    COUNT(*) as slow_query_count, -- Агрегация: подсчет
    AVG(query_time) as avg_duration
FROM mysql.slow_log
WHERE event_time > NOW() - INTERVAL 1 HOUR -- Фильтр ДО группировки: только записи за последний час
GROUP BY user_host
HAVING slow_query_count > 1000 -- Фильтр ПОСЛЕ группировки: только группы с большим количеством запросов
   AND avg_duration > 5.0;    -- ...и со средней длительностью больше 5 секунд

Почему нельзя использовать WHERE для slow_query_count? Потому что на этапе WHERE агрегатные функции (COUNT(), AVG(), SUM()) еще не вычислены — они существуют только для целых групп, созданных GROUP BY. HAVING — это единственный способ отфильтровать результат по этим вычисленным агрегатным значениям.