Вступить в клуб →
лёгкаявопросSQL и витрины данных

Перенос условия из HAVING в WHERE

Запрос выбирает пользователей с тремя и более оплаченными заказами:

SELECT user_id, COUNT(*) AS purchases
FROM orders
WHERE status = 'paid'
GROUP BY user_id
HAVING COUNT(*) >= 3;

Коллега предлагает «упростить»: перенести условие COUNT(*) >= 3 в WHERE и убрать HAVING. Что произойдёт?

  • Запрос завершится ошибкой: WHERE выполняется до группировки и не видит агрегатов, условие на COUNT возможно только в HAVING или во внешнем запросе поверх подзапроса
  • Ничего не изменится: WHERE и HAVING взаимозаменяемы, HAVING просто медленнее на больших таблицах, потому что фильтрует уже собранные группы, а не исходные строки, и оптимизатор не может пробросить его условие в чтение
  • Запрос отработает и вернёт всех пользователей с оплаченными заказами, потому что COUNT в WHERE применится к каждой строке и всегда даст 1
  • Запрос отработает, но посчитает заказы во всех статусах, потому что WHERE будет перегружен двумя условиями

🔒 Проверка ответа — для участников клуба

  • Проверка ответа
  • Подсказка, если застряли
  • Разбор с объяснением, почему так
  • Прогресс по всем задачам и виртуальные собеседования
Зарегистрироваться →

Регистрация занимает минуту

Другие задачи раздела