Агрегатные функции: COUNT, SUM, AVG, MIN, MAX
Содержание курса
Агрегация после WHERE: функция видит только отфильтрованные строки
Когда в запросе есть WHERE, агрегатная функция получает на вход не всю таблицу, а только строки, прошедшие фильтр. Порядок выполнения жёсткий: сначала FROM определяет таблицу, затем WHERE отбирает строки, и лишь потом агрегатная функция работает с тем, что осталось.
SELECT
COUNT(*) AS количество,
SUM(amount) AS итого
FROM orders
WHERE amount >= 1000;
Этот запрос считает и суммирует только те заказы, у которых amount не меньше 1000. Заказы с меньшей суммой до агрегатной функции не доходят вообще — они отсеяны раньше.
Важно понять, что WHERE и агрегация — это не конкуренты, а последовательные этапы. WHERE не знает об агрегатных функциях, а агрегатная функция не знает о строках, которые WHERE уже отбросил. Именно поэтому нельзя написать WHERE COUNT(*) > 10 — в момент проверки WHERE агрегация ещё не произошла, значения COUNT(*) просто не существует. Для фильтрации по результату агрегации есть отдельный инструмент, который появится в следующих уроках.
Практически это означает: комбинируя WHERE с агрегатными функциями, вы задаёте вопрос «какова итоговая картина по конкретному подмножеству данных?». Например, средний чек среди заказов дороже 1000, количество заказов за конкретный период или максимальная сумма среди заказов дешевле 5000 — всё это пишется именно так: условие в WHERE, итог в SELECT.
