Ответ вслух Junior GROUP BY и агрегаты обновлено

Агрегаты и NULL

Вопрос

Как агрегатные функции обрабатывают NULL? Какие ошибки из-за этого бывают в отчётах?

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Агрегаты, кроме COUNT(), просто пропускают NULL. Это меняет смысл: AVG(score) делит на число заполненных значений, и если половина студентов не сдала работу, средний балл получится выше, чем «по всем».

Что должно прозвучать в ответе

  • Все агрегаты, кроме 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 ошибок.

Термины по теме