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

Ответ

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