GROUP BY и HAVING
099 мин
GROUP BY раскладывает строки на группы с одинаковым значением и считает отдельно для каждой группы. «Сколько студентов из каждого города?», «средняя цена в каждой категории?» — это всё он.
Как это работает
База раскладывает студентов по «стопкам» по городам, а потом считает каждую стопку. В результате каждый город — одна строка.
Правило
Каждый столбец в SELECT должен либо стоять в GROUP BY, либо быть внутри агрегата:
PostgreSQL проверяет это правило всегда: при нарушении — ошибка «must appear in the GROUP BY clause».
HAVING — условие для групп
WHERE фильтрует строки до группировки, а HAVING — группы после:
Вместе:
Порядок выполнения
Запрос пишется в таком порядке, и база выполняет его почти так же:
FROM— какая таблица;WHERE— какие строки;GROUP BY— группировка;HAVING— какие группы;SELECT— что показать;ORDER BY,LIMIT— порядок и ограничение.
Поэтому COUNT(*) нельзя использовать в WHERE — на этом шаге групп ещё нет.
Выведите число заказов для каждого статуса (status): статус и количество.
Выведите бренды, у которых не меньше 4 товаров: brand и количество товаров.
Выведите сумму amount платежей по каждому способу оплаты (method).
Запомните
GROUP BY— подсчёт по группам; обычные столбцы изSELECTдолжны быть вGROUP BY.WHERE— для строк,HAVING— для групп.- Порядок:
FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY.