Выбор ответа Middle GROUP BY и агрегаты обновлено

Условие без агрегата: WHERE или HAVING

Вопрос

В запросе с GROUP BY city условие city = 'Москва' можно написать и в WHERE, и в HAVING. Что верно?

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

Выберите вариант, и откроется разбор.

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

Коротко

Правильный ответ: Результат одинаковый, но в WHERE строки отсеются раньше. HAVING может ссылаться на колонки из GROUP BY, поэтому оба варианта корректны и дают одно и то же.

Варианты ответа

  1. Результат одинаковый, но в WHERE строки отсеются раньшеправильный ответ
  2. Только в HAVING, потому что city есть в GROUP BY
  3. Результат будет разным: HAVING не видит колонку city
  4. В HAVING можно писать только агрегатные функции

Разбор

HAVING может ссылаться на колонки из GROUP BY, поэтому оба варианта корректны и дают одно и то же. Но WHERE убирает лишние строки ещё до группировки, это естественнее и обычно дешевле (хотя PostgreSQL умеет сам переносить такие условия). Утверждение, что в HAVING допустимы только агрегаты, неверно: допустимы и колонки группировки.

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

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

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