Ответ вслух Junior GROUP BY и агрегаты спрашивают часто обновлено

WHERE и HAVING

Вопрос

Чем отличается WHERE от HAVING? Приведи пример, где нужны оба.

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

WHERE и HAVING оба фильтруют, но на разных этапах. WHERE работает со строками до группировки, поэтому агрегатов в нём быть не может: групп ещё нет.

Что должно прозвучать в ответе

  • WHERE фильтрует строки до группировки, HAVING фильтрует группы после

  • В WHERE нельзя агрегаты, в HAVING можно

  • Порядок: FROM, WHERE, GROUP BY, HAVING, SELECT

  • Условия без агрегатов лучше писать в WHERE: меньше строк до группировки

  • Пример: WHERE status = 'paid' и HAVING SUM(total) > 10000

Что могут спросить следом

  • Можно ли в HAVING использовать алиас из SELECT?
  • Можно ли написать HAVING без GROUP BY?

Разбор

WHERE и HAVING оба фильтруют, но на разных этапах. WHERE работает со строками до группировки, поэтому агрегатов в нём быть не может: групп ещё нет. HAVING применяется после GROUP BY к готовым группам, и там можно писать COUNT(*), SUM и так далее. Пример: найти клиентов, у которых оплаченных заказов больше чем на 10 тысяч. Статус paid это свойство строки, его в WHERE. Сумма это свойство группы, её в HAVING: WHERE status = 'paid' GROUP BY customer_id HAVING SUM(total) > 10000. Если условие не зависит от агрегата, его лучше ставить в WHERE, тогда до группировки дойдёт меньше строк. И кстати, HAVING без GROUP BY допустим: вся таблица считается одной группой.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме