Перенос условия из 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 будет перегружен двумя условиями
