Ответ
Да, это абсолютно допустимо с точки зрения синтаксиса 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) или по сгруппированным полям, если условие зависит от агрегата.