Карта / SQL / GROUP BY

GROUP BY

GROUP BY разбивает строки на группы по значению столбца, и агрегатная функция считает результат по каждой группе отдельно.

SELECT city, COUNT(*) FROM users GROUP BY city;
-- Москва: 120
-- Питер: 80
-- ...

Без GROUP BY агрегатная функция считала бы по всей таблице сразу, с ним — по каждому значению city отдельно.

Копнуть глубже

HAVING — фильтр для уже сгруппированных данных, в отличие от WHERE, который фильтрует строки до группировки:

SELECT city, COUNT(*) AS total
FROM users
GROUP BY city
HAVING COUNT(*) > 100;   -- только города, где больше 100 пользователей

WHERE city = 'Москва' нельзя заменить на HAVING city = 'Москва', потому что WHERE отбирает строки до группировки (быстрее), а HAVING — после, по результату агрегации (COUNT, SUM и т.д.). Главное правило: если условие про отдельную строкуWHERE, если про результат агрегацииHAVING.

🎤 Закрыл тему, если можешь объяснить:
• что делает GROUP BY на примере подсчёта по городам;
• разницу WHERE и HAVING (если дошёл до 2-го слоя).