Агрегаты и NULL
Вопрос
Как агрегатные функции обрабатывают NULL? Какие ошибки из-за этого бывают в отчётах?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Все агрегаты, кроме COUNT(*), пропускают NULL
AVG делит на число непустых значений, а не на число строк
SUM, AVG, MIN, MAX на пустом наборе дают NULL, COUNT даёт 0
COUNT(*) после LEFT JOIN считает строку с NULL, нужен COUNT(правая.id)
COALESCE для подстановки нуля там, где этого требует смысл
Что могут спросить следом
- Что вернёт SUM, если все значения NULL?
- Как посчитать среднее, считая пропуски нулями?
Разбор
Агрегаты, кроме COUNT(*), просто пропускают NULL. Это меняет смысл: AVG(score) делит на число заполненных значений, и если половина студентов не сдала работу, средний балл получится выше, чем «по всем». Если пропуски надо считать нулём, пишем AVG(COALESCE(score, 0)), но это решение по смыслу, а не по технике. На пустом наборе или если все значения NULL, SUM возвращает NULL, а не 0, поэтому в отчётах оборачивают в COALESCE(SUM(x), 0). COUNT никогда не возвращает NULL. И частая ошибка с LEFT JOIN: у пустой группы остаётся строка с NULL, COUNT(*) её посчитает и покажет 1 вместо 0, нужно COUNT(правая_таблица.id).
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.