Получить доступ

Чем HAVING отличается от WHERE?

JuniorSQL-запросыSQL
Ещё спрашивают так:
  • Как отфильтровать результат GROUP BY?
  • В каком порядке выполняется SELECT?
Коротко

WHERE фильтрует строки до группировки, HAVING — группы после агрегации. Условие на count() или sum() — только в HAVING.

  • Логический порядок: FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT
  • Поэтому в WHERE нельзя использовать агрегаты и псевдонимы из SELECT
  • Условия на обычные колонки лучше в WHERE — меньше строк попадёт в группировку

А ещё HAVING без GROUP BY — вся таблица как одна группа

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Логический порядок выполнения SELECT:

  1. FROM и JOIN — собрать строки;
  2. WHERE — отфильтровать строки;
  3. GROUP BY — сгруппировать;
  4. HAVING — отфильтровать группы;
  5. SELECT — вычислить выражения и псевдонимы;
  6. ORDER BY — отсортировать;
  7. 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?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем