GROUP BY

Базовый SQL
≈ 1 мин чтения

GROUP BY создаёт отдельный итог для каждой группы

Без группировки агрегатная функция считает итог по всей выборке. GROUP BY делит строки на группы по одинаковым значениям и запускает агрегирование отдельно для каждой группы.

SELECT status, COUNT(*) AS order_count
FROM orders
GROUP BY status;

Если в таблице есть заказы со статусами NEW, PAID и CANCELLED, результат содержит по одной строке для каждого статуса и количество заказов в этой группе.

Что можно выводить рядом с агрегатом

После группировки столбец в SELECT должен либо определять группу, либо использоваться внутри агрегатной функции. Иначе непонятно, какое значение из нескольких строк группы нужно вывести.

SELECT category, AVG(price) AS average_price
FROM products
GROUP BY category;

Здесь category определяет группу, а AVG(price) вычисляет одно значение для строк внутри этой группы.

Полезно мысленно представить GROUP BY как «собрать одинаковые значения в корзины». После этого агрегатная функция считается отдельно внутри каждой такой корзины.