Как работает оператор GROUP BY в SQL?

Ответ

Оператор GROUP BY в SQL группирует строки результирующего набора по одинаковым значениям в одном или нескольких указанных столбцах. Он используется совместно с агрегатными функциями (COUNT, SUM, AVG, MAX, MIN) для выполнения вычислений над каждой группой.

Базовый синтаксис:

SELECT column1, AGGREGATE_FUNCTION(column2)
FROM table_name
WHERE condition  -- Фильтрация ДО группировки
GROUP BY column1
HAVING condition; -- Фильтрация ПОСЛЕ группировки

Пример: Подсчёт сотрудников и средней зарплаты по отделам.

SELECT 
    department_id,
    COUNT(*) AS employee_count,
    AVG(salary) AS average_salary
FROM employees
WHERE active = TRUE  -- Берутся только активные сотрудники
GROUP BY department_id
HAVING COUNT(*) > 5; -- Показываем только отделы с >5 сотрудников

Ключевые правила и best practices:

  1. Согласованность SELECT и GROUP BY: Все неагрегированные столбцы в SELECT должны быть перечислены в GROUP BY.
  2. Порядок выполнения: WHEREGROUP BYАгрегатные функцииHAVINGORDER BY.
  3. Производительность: Группировка по индексированным столбцам выполняется быстрее. На больших таблицах GROUP BY может быть ресурсоёмкой операцией.
  4. Группировка по нескольким полям: GROUP BY department_id, job_title создаст уникальные группы для каждой комбинации отдела и должности.

GROUP BY — фундаментальный инструмент для аналитических запросов и построения отчётов.

Ответ 18+ 🔞

А, ну вот, опять эти ваши группировки, блядь! Сидишь такой, думаешь: "Хочу посчитать, сколько у меня в каждом отделе народу и сколько они в среднем жрут денег". А SQL тебе такой: "Да не вопрос, чувак, но правила соблюдай, а то я тебе сейчас такую ошибку выдам, что в рот меня чих-пых!"

Смотри сюда, главный принцип, который все забывают, как только выпьют: всё, что ты пишешь в SELECT и не оборачиваешь в какую-нибудь агрегатную функцию (типа SUM, COUNT), должно быть в GROUP BY. Иначе база посмотрит на тебя, как на идиота, и скажет: "Мужик, я не могу решить, какое значение из группы тебе показать, ты определись!". И будет прав, пидарас шерстяной.

Вот смотри, как это выглядит вживую, на примере таблички employees:

SELECT 
    department_id, -- Вот это поле мы группируем
    COUNT(*) AS employee_count, -- Считаем, сколько душ в каждой группе
    AVG(salary) AS average_salary -- И среднюю зп по палате выводим
FROM employees
WHERE active = TRUE  -- Это фильтр ДО того, как мы начнём кучковаться. Неактивных сразу отсеиваем.
GROUP BY department_id -- Говорим: "Собирай всех по отделам, блядь!"
HAVING COUNT(*) > 5; -- А это фильтр ПОСЛЕ группировки. "Покажи только те отделы, где больше 5 человек, а то мелочь неинтересна".

А теперь про порядок, чтобы не путаться, как мудак в дверях. SQL выполняет всё не абы как, а по чёткому плану:

  1. WHERE — сначала отфильтровывает строки по условию. Как будто отсеивает мудаков.
  2. GROUP BY — потом сбивает оставшихся в кучки по общему признаку.
  3. Агрегатные функции (COUNT, SUM) — и только теперь начинает считать по этим кучам.
  4. HAVING — и напоследок отфильтровывает уже сами получившиеся кучи (группы).
  5. ORDER BY — ну и выводит всё красиво, если попросишь.

И ещё, блядь, важный момент на будущее: если сгруппируешь по двум полям, типа GROUP BY department_id, job_title, то получишь уникальные группы для каждой пары "отдел + должность". Это как если бы ты в армии строил не просто роты, а роты, внутри которых ещё и по ранжиру. Сначала все лейтенанты из первого отдела, потом все сисадмины из первого отдела, и так далее, ёпта.

Короче, GROUP BY — это овердохуища полезная штука для отчётов, но если её неправильно юзать, можно такую кашу в данных заварить, что потом разгребать неделю. Главное — помни про правило SELECT/GROUP BY и не путай WHERE с HAVING. Всё остальное — дело техники и опыта, блядь.