Как используются агрегатные функции в базах данных
Что проверяют
Понимаете ли вы связь агрегатов с группировкой и знаете ли поведение при NULL.
Как отвечать
Агрегатная функция сворачивает набор строк в одно значение: COUNT, SUM, AVG, MIN, MAX, а также STRING_AGG и ARRAY_AGG для сборки списков.
Без GROUP BY вся выборка считается одной группой. С GROUP BY результат получается по одной строке на каждую группу, и в SELECT можно выводить только поля из группировки и сами агрегаты.
select company, count(*) as jobs, avg(salary_min) as avg_salary
from jobs
where is_active
group by company
having count(*) > 5;Что важно знать про NULL, потому что здесь чаще всего и ошибаются:
COUNT(*)считает строки,COUNT(колонка)пропускаетNULL. Разница именно в этом;AVGиSUMтоже игнорируютNULL. Поэтому среднее по колонке с пропусками считается не по всем строкам, и результат отличается от суммы, делённой на общее число;COUNT(DISTINCT колонка)считает уникальные непустые значения.
И про фильтрацию: WHERE работает до группировки и не может содержать агрегаты, HAVING после и предназначен именно для них. Условие, которое можно проверить на строке, всегда ставят в WHERE, иначе группируется лишнее.
Полезно упомянуть оконные функции: они считают агрегат, не схлопывая строки, и это то, чего GROUP BY не умеет.
Где спотыкаются
Пишут агрегат в WHERE.
Не различают COUNT(*) и COUNT(колонка).
Забывают, что среднее игнорирует пропуски, и получают завышенное значение.
Выводят в SELECT поле, которого нет ни в группировке, ни под агрегатом.