АгрегатыНачальный
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Агрегатные функции для вычисления суммы, среднего, минимума и максимума числовых значений.
Анекдоты по теме
— Что вернёт AVG(salary) если все зарплаты NULL? — NULL. — А SUM? — NULL. — А COUNT(salary)? — 0. COUNT считает непустые, их нет. — А COUNT(*)? — Количество строк. Это COUNT строк, не значений.
— Как удалить дубликаты из таблицы? — DELETE FROM users WHERE id NOT IN ( SELECT MIN(id) FROM users GROUP BY email ); — Это удалит все дубли кроме первого? — Именно. MIN(id) оставляет самую раннюю запись.
Почему GROUP BY не зовут на дни рождения? Потому что он всех складывает в кучу и выдаёт по одному подарку на группу.