АгрегатыНачальный
GROUP BY
Группирует строки с одинаковыми значениями для применения агрегатных функций.
Синтаксис
SELECT col, AGG(col2) FROM table GROUP BY col;Объяснение
GROUP BY схлопывает группы строк в одну. В SELECT можно использовать только колонки из GROUP BY или агрегатные функции.
Порядок: WHERE (фильтр строк) → GROUP BY (группировка) → HAVING (фильтр групп) → SELECT.
Пример
-- Количество заказов и сумма по каждому пользователю
SELECT
user_id,
COUNT(*) AS orders_count,
SUM(total) AS total_spent
FROM orders
GROUP BY user_id
ORDER BY total_spent DESC;Связанные термины
AVGВозвращает среднее арифметическое числовых значений. NULL игнорируются.COUNTСчитает количество строк или непустых значений в группе.HAVINGФильтрует группы после GROUP BY. В отличие от WHERE, может использовать агрегатные функции.SUM / AVG / MIN / MAXАгрегатные функции для вычисления суммы, среднего, минимума и максимума числовых значений.
Анекдоты по теме
Почему HAVING обижается на WHERE? — Потому что WHERE фильтрует строки ДО группировки, а HAVING — ПОСЛЕ. WHERE думает, что он главный, а HAVING знает: истина где-то в агрегатах.
— Что такое ROLLUP? — Групповая агрегация с промежуточными итогами. SELECT year, month, SUM(sales) FROM data GROUP BY ROLLUP(year, month); — Добавляет строки: итого за год и итого за всё. — Как сводная таблица в Excel? — Именно. Только в SQL.
— Почему GROUP BY обижается, когда в SELECT есть колонка не из группировки? — Потому что не знает, какое значение выбрать из группы. Ему нужна определённость.