Чем HAVING отличается от WHERE?
- Как отфильтровать результат GROUP BY?
- В каком порядке выполняется SELECT?
WHERE фильтрует строки до группировки, HAVING — группы после агрегации. Условие на count() или sum() — только в HAVING.
- Логический порядок: FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT
- Поэтому в WHERE нельзя использовать агрегаты и псевдонимы из SELECT
- Условия на обычные колонки лучше в WHERE — меньше строк попадёт в группировку
А ещё HAVING без GROUP BY — вся таблица как одна группа
Подробно
Логический порядок выполнения SELECT:
- FROM и JOIN — собрать строки;
- WHERE — отфильтровать строки;
- GROUP BY — сгруппировать;
- HAVING — отфильтровать группы;
- SELECT — вычислить выражения и псевдонимы;
- ORDER BY — отсортировать;
- LIMIT/OFFSET — обрезать.
Отсюда правила: в WHERE агрегатов ещё нет (группы не построены), поэтому WHERE count(*) > 5 — ошибка; в HAVING агрегаты доступны. Псевдонимы из SELECT в WHERE не видны (в ORDER BY — видны).
Производительность: условие на обычную колонку (status = 'paid') можно написать и в HAVING, но правильнее в WHERE — строки отсеются до группировки, и база сможет использовать индекс.
Оптимизатор может менять физический порядок, но результат обязан совпадать с логическим.
Пример
-- клиенты, сделавшие больше 5 оплаченных заказов в 2026 году
SELECT customer_id, count(*) AS cnt
FROM orders
WHERE status = 'paid' AND created_at >= '2026-01-01' -- строки
GROUP BY customer_id
HAVING count(*) > 5; -- группыЧто хотят услышать
- До и после группировки.
- Логический порядок выполнения SELECT.
- Почему агрегаты только в HAVING и где лучше простые условия.
Частые ошибки
- Агрегат в WHERE.
- Фильтрация обычных колонок в HAVING.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✓HAVING фильтрует группы после GROUP BY и видит агрегаты, WHERE — строки до неё
- ✗HAVING фильтрует строки до группировки, а WHERE — уже готовые группы вместе с агрегатами
- ✗Это полные синонимы, разница лишь в стиле записи
- ✗HAVING можно использовать только без GROUP BY
Что спросят дальше
- Каков логический порядок выполнения SELECT?
- Когда индекс поможет условию WHERE?
Разбор темы
- SQL: операторы, NULL и фильтрация
Группы команд, логический порядок SELECT, трёхзначная логика NULL, разница WHERE/HAVING и оконные функции — с ловушками, на которых валятся на собеседовании.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.