GROUP BY для одного и нескольких столбцов
Группируйте строки по одному или нескольким столбцам, чтобы получать промежуточные итоги и разбивку по категориям, и изучайте планы запросов GROUP BY
«GROUP BY для одного и нескольких столбцов» — бесплатный урок SQL Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения SQL Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс SQL Academy содержит 4 уроков всего.
Что делает GROUP BY
GROUP BY разбивает строки на группы по значениям одного или нескольких столбцов, а затем применяет агрегатные функции к каждой группе.
Группировка по одному столбцу
Общее количество заказов для каждого пользователя:
SELECT user_id, COUNT(*) AS order_count, SUM(total) AS revenue
FROM orders
GROUP BY user_id
ORDER BY revenue DESC;Группировка по нескольким столбцам
Подгруппы по категории и стране:
SELECT country, category, SUM(total) AS revenue
FROM orders o
JOIN products p ON p.id = o.product_id
JOIN users u ON u.id = o.user_id
GROUP BY country, category
ORDER BY country, revenue DESC;Каждый столбец в SELECT должен участвовать в группировке или агрегации
Правило стандартного SQL:
-- WRONG — email is neither grouped nor aggregated:
SELECT user_id, email, COUNT(*)
FROM orders
GROUP BY user_id; -- ERROR
-- RIGHT — group by both, or use an aggregate:
SELECT user_id, MAX(email) AS email, COUNT(*)
FROM orders
GROUP BY user_id;GROUP BY по выражению
Группировка по результату выражения, например по месячному интервалу:
SELECT date_trunc('month', created_at) AS month, SUM(total)
FROM orders
GROUP BY date_trunc('month', created_at)
ORDER BY month;GROUP BY по позиции или псевдониму
В PostgreSQL можно выполнять группировку по позиции в списке SELECT или по псевдониму:
SELECT date_trunc('month', created_at) AS month, SUM(total)
FROM orders
GROUP BY month -- alias
ORDER BY 1; -- positionНаборы группировки, ROLLUP и CUBE
Вычисление нескольких вариантов группировки в одном запросе — идеально для промежуточных итогов:
SELECT country, category, SUM(total)
FROM orders o JOIN ...
GROUP BY ROLLUP (country, category);
-- Returns: per (country, category), per country, grand totalПустых групп не бывает
GROUP BY возвращает только группы, содержащие хотя бы одну строку. Если нужны все категории, включая категории без заказов, начните с основного списка и выполните LEFT JOIN, а затем примените агрегацию.
GROUP BY и индексы
Планировщик может использовать агрегирование с хешированием, то есть построить хеш-таблицу групп, или применить стратегию сортировки с последующей группировкой. Индексы по столбцам группировки могут ускорить второй подход.
Оконные функции и GROUP BY
GROUP BY объединяет строки. Оконные функции добавляют столбцы с агрегатными значениями, сохраняя каждую строку. Выбирайте подходящий инструмент — это подробно рассматривается в уроке «Подробно об оконных функциях».
Псевдонимы в HAVING и WHERE
Логический порядок: FROM → WHERE → GROUP BY → HAVING → SELECT. WHERE не видит агрегатные значения, а HAVING видит.
Итоги
GROUP BY — основной инструмент для создания отчетов.
- Каждый столбец в SELECT должен участвовать в группировке или агрегации
- Выполняйте группировку по столбцам, выражениям или псевдонимам
- Используйте ROLLUP, CUBE и GROUPING SETS для перекрестных таблиц
Быстрая проверка
В запросе с GROUP BY country может ли список SELECT содержать столбец city, который не участвует ни в агрегации, ни в группировке?
Часто задаваемые вопросы
Урок «GROUP BY для одного и нескольких столбцов» бесплатный?
Да — полный текст урока «GROUP BY для одного и нескольких столбцов» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс SQL Academy, подпишись на CoddyKit PRO. Курс SQL Academy содержит 4 уроков всего.
Чему я научусь в уроке «GROUP BY для одного и нескольких столбцов»?
Группируйте строки по одному или нескольким столбцам, чтобы получать промежуточные итоги и разбивку по категориям, и изучайте планы запросов GROUP BY Ты практикуешь SQL Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать SQL Academy?
Предыдущий опыт не требуется. SQL Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «GROUP BY для одного и нескольких столбцов»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке SQL Academy?
Да. Каждый урок SQL Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- COUNT, SUM, AVG, MIN, MAX
- GROUP BY для одного и нескольких столбцов
- HAVING и WHERE
- Распространённые ошибки: NULL в агрегатах