АгрегатыНачальный
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Агрегатные функции для вычисления суммы, среднего, минимума и максимума числовых значений.
Анекдоты по теме
— Почему агрегатные функции ненавидят NULL? — Потому что COUNT() их считает, а SUM(колонка) — игнорирует. Двойные стандарты!
Аналитик пишет SUM(revenue) и получает NULL. Он в панике звонит DBA. DBA: проверь, есть ли NULL в колонке revenue. Аналитик: есть несколько. DBA: один NULL заражает всю сумму. Используй SUM(COALESCE(revenue, 0)).
Аналитик хочет топ-3 продукта в каждой категории. Пишет GROUP BY, ORDER BY, LIMIT 3. Получает топ-3 вообще, не по категориям. DBA: тебе нужна оконная функция. ROW_NUMBER() OVER (PARTITION BY category ORDER BY sales DESC) Потом WHERE rn <= 3. Аналитик: почему это не просто LIMIT 3 внутри GROUP BY?! DBA: потому что SQL так работает.