Ответ
Оператор 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:
- Согласованность SELECT и GROUP BY: Все неагрегированные столбцы в
SELECTдолжны быть перечислены вGROUP BY. - Порядок выполнения:
WHERE→GROUP BY→Агрегатные функции→HAVING→ORDER BY. - Производительность: Группировка по индексированным столбцам выполняется быстрее. На больших таблицах
GROUP BYможет быть ресурсоёмкой операцией. - Группировка по нескольким полям:
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 выполняет всё не абы как, а по чёткому плану:
WHERE— сначала отфильтровывает строки по условию. Как будто отсеивает мудаков.GROUP BY— потом сбивает оставшихся в кучки по общему признаку.- Агрегатные функции (
COUNT,SUM) — и только теперь начинает считать по этим кучам. HAVING— и напоследок отфильтровывает уже сами получившиеся кучи (группы).ORDER BY— ну и выводит всё красиво, если попросишь.
И ещё, блядь, важный момент на будущее: если сгруппируешь по двум полям, типа GROUP BY department_id, job_title, то получишь уникальные группы для каждой пары "отдел + должность". Это как если бы ты в армии строил не просто роты, а роты, внутри которых ещё и по ранжиру. Сначала все лейтенанты из первого отдела, потом все сисадмины из первого отдела, и так далее, ёпта.
Короче, GROUP BY — это овердохуища полезная штука для отчётов, но если её неправильно юзать, можно такую кашу в данных заварить, что потом разгребать неделю. Главное — помни про правило SELECT/GROUP BY и не путай WHERE с HAVING. Всё остальное — дело техники и опыта, блядь.