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

Агрегат в WHERE

Вопрос

Нужно вывести клиентов, у которых больше 5 заказов. Что произойдёт с этим запросом?

SELECT customer_id, COUNT(*)
FROM orders
WHERE COUNT(*) > 5
GROUP BY customer_id;

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

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

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

Коротко

Правильный ответ: Ошибка: агрегат нельзя в WHERE, нужно HAVING COUNT() 5. WHERE выполняется до группировки, групп и их размеров на этом шаге ещё нет, поэтому PostgreSQL выдаст ошибку «aggregate functions are not allowed in WHERE».

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

  1. Запрос вернёт верный результат: WHERE увидит итог группировки
  2. Запрос вернёт всех клиентов: условие проверяется до группировки
  3. Ошибка: COUNT(*) нельзя использовать вместе с GROUP BY
  4. Ошибка: агрегат нельзя в WHERE, нужно HAVING COUNT(*) > 5правильный ответ

Разбор

WHERE выполняется до группировки, групп и их размеров на этом шаге ещё нет, поэтому PostgreSQL выдаст ошибку «aggregate functions are not allowed in WHERE». Фильтр по агрегату пишется в HAVING. Молча вернуть всех клиентов база не может, она отклонит запрос на этапе разбора. COUNT(*) с GROUP BY, конечно, совместим.

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

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

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