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-го слоя).
• разницу WHERE и HAVING (если дошёл до 2-го слоя).