Ответ
Да, это абсолютно допустимо с точки зрения синтаксиса 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) или по сгруппированным полям, если условие зависит от агрегата.
Ответ 18+ 🔞
А, ну это же классика, ёпта! Смотри, тут всё просто, как три копейки. Многие чуваки думают, что HAVING без WHERE — это типа преступление какое-то. Нихуя подобного! Всё дело в том, когда эта фильтрация срабатывает, вот в чём прикол.
Представь себе: ты на кухне готовишь салат. WHERE — это когда ты отбираешь помидоры, отбрасываешь гнилые, ещё до того, как начал всё резать и мешать. А HAVING — это когда ты уже всё намешал, попробовал и говоришь: «Соли мало, ещё сыпь» или «Майонеза овердохуища, давай уберём». Понимаешь разницу?
Пример 1: HAVING соло (редко, но метко)
-- Найти общее количество юзеров, но только если их больше сотни
SELECT COUNT(*) as user_count FROM users
HAVING user_count > 100;
Вот смотри: мы просто посчитали всех юзеров разом. Отдельные строки не фильтровали — нам похуй, какие они там. Нас интересует только итоговая циферка. И если эта циферка меньше ста — результат вообще пустой будет, нихуя не вернётся. WHERE тут и не нужен, потому что фильтровать нечего до подсчёта.
Пример 2: Обычная история с GROUP BY (тут уже мясо)
-- Найти отделы, где средняя зарплата за 50к, и народу там больше пяти человек
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— фильтруешь по тому, что только что насчитал (среднее, сумму, количество). Как будто пробуешь на вкус готовое блюдо.
Вот и вся магия. Ничего сложного, главное — понять этот момент. А то некоторые так и норовят в HAVING запихнуть то, что в WHERE прекрасно работает, а потом удивляются, почему запрос тормозит, как черепаха в сиропе.