Можно ли использовать предложение HAVING без WHERE в SQL-запросе?

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

Ответ

Да, это абсолютно допустимо с точки зрения синтаксиса SQL. Ключевое различие между WHERE и HAVING заключается не в их обязательности, а в моменте применения фильтрации.

  • WHERE — фильтрует строки до группировки (GROUP BY) и вычисления агрегатных функций.
  • HAVING — фильтрует результаты после группировки и вычисления агрегатных функций.

Пример 1: HAVING без WHERE (корректно, но редко)

-- Найти общее количество пользователей, но только если их больше 100
SELECT COUNT(*) as user_count FROM users
HAVING user_count > 100;

Здесь HAVING отфильтрует уже вычисленный агрегат COUNT(*). WHERE не нужен, так как фильтрации отдельных строк нет.

Пример 2: Типичный случай использования с GROUP BY

-- Найти отделы, в которых средняя зарплата превышает 50000, и в отделе больше 5 сотрудников
SELECT 
    department_id, 
    AVG(salary) as avg_salary,
    COUNT(*) as emp_count
FROM employees
WHERE active = 1 -- Фильтрация строк ДО группировки (например, только активные сотрудники)
GROUP BY department_id
HAVING avg_salary > 50000 AND emp_count > 5; -- Фильтрация групп ПОСЛЕ группировки

Практическое правило:

  • Используйте WHERE для фильтрации по полям, которые есть в исходной таблице.
  • Используйте HAVING для фильтрации по результатам агрегатных функций (COUNT, SUM, AVG) или по сгруппированным полям, если условие зависит от агрегата.