Распространённые ошибки: NULL в агрегатах
Избегайте классических ловушек с NULL: AVG игнорирует NULL, COUNT(столбец) пропускает NULL, а группировка по допускающим NULL столбцам может давать неожиданные результаты
«Распространённые ошибки: NULL в агрегатах» — бесплатный урок SQL Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения SQL Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс SQL Academy содержит 4 уроков всего.
Агрегатные функции пропускают NULL
Все агрегатные функции, кроме COUNT(*), игнорируют входные значения NULL. Иногда это именно то, что нужно, а иногда — ошибка.
Классическая ловушка: COUNT(*) и COUNT(col)
Результаты различаются, когда столбец содержит значения NULL:
SELECT COUNT(*) FROM users; -- 1000
SELECT COUNT(email) FROM users; -- 950 (50 users have NULL email)Ошибка: AVG не считает NULL нулем
Оценки [5, 5, NULL] → AVG = 5, а не (5+5+0)/3 = 3,33. Убедитесь, что это соответствует вашим требованиям.
SELECT AVG(rating) FROM reviews; -- 5
SELECT AVG(COALESCE(rating, 0)) FROM reviews; -- 3.33Пустая таблица = агрегатное значение NULL
Если ни одна строка не подходит, SUM, AVG, MIN и MAX возвращают NULL, а не 0. Обработайте это с помощью COALESCE:
SELECT COALESCE(SUM(total), 0) AS revenue
FROM orders
WHERE user_id = 999999; -- safe even when user has no ordersSUM для столбца со значениями NULL
Если значение в каждой строке равно NULL, SUM возвращает NULL, а не 0. Это та же ловушка.
GROUP BY с ключом группировки NULL
NULL образует отдельную группу:
SELECT country, COUNT(*) FROM users
GROUP BY country;
-- → ('US', 100), ('CA', 30), (NULL, 5)Подсчет уникальных значений с NULL
COUNT(DISTINCT col) игнорирует NULL:
INSERT INTO t (c) VALUES (1),(2),(NULL),(NULL),(2);
SELECT COUNT(DISTINCT c) FROM t; -- 2 (NULL not counted)DISTINCT по нескольким столбцам
Кортеж, содержащий NULL, все равно считается отличным от другого кортежа с теми же столбцами, отличными от NULL:
SELECT COUNT(*) FROM (
SELECT DISTINCT a, b FROM t
) sub;Остерегайтесь неявных соединений с необязательными таблицами
LEFT JOIN может добавить значения NULL и изменить результат агрегатной функции. Решите, нужно ли считать такие строки или отфильтровать их:
SELECT u.id, COUNT(o.id) AS orders
FROM users u
LEFT JOIN orders o ON o.user_id = u.id
GROUP BY u.id; -- COUNT(o.id) gives 0 for users with no ordersFILTER для условного подсчета
FILTER понятнее, чем использование CASE внутри SUM:
SELECT COUNT(*) FILTER (WHERE status = 'paid') AS paid_count,
COUNT(*) FILTER (WHERE status = 'refunded') AS refund_count
FROM orders;Всегда проверяйте агрегатные функции со значениями NULL
Добавляя новый запрос с агрегатной функцией, выполните его на примере, содержащем NULL. Такая ошибка почти никогда не проявляется на чистых тестовых данных.
Итоги
Сочетание NULL и агрегатных функций — самая распространенная ошибка в SQL.
- Агрегатные функции пропускают NULL, кроме COUNT(*)
- Пустой результат → NULL, а не 0
- Используйте COALESCE, если нужен результат 0
- Внимательно проверяйте агрегатные функции с LEFT JOIN
Быстрая проверка
В таблице отзывов оценки [5, 5, NULL, 1]. Что вернет AVG(rating)?
Часто задаваемые вопросы
Урок «Распространённые ошибки: NULL в агрегатах» бесплатный?
Да — полный текст урока «Распространённые ошибки: NULL в агрегатах» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс SQL Academy, подпишись на CoddyKit PRO. Курс SQL Academy содержит 4 уроков всего.
Чему я научусь в уроке «Распространённые ошибки: NULL в агрегатах»?
Избегайте классических ловушек с NULL: AVG игнорирует NULL, COUNT(столбец) пропускает NULL, а группировка по допускающим NULL столбцам может давать неожиданные результаты Ты практикуешь SQL Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать SQL Academy?
Предыдущий опыт не требуется. SQL Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Распространённые ошибки: NULL в агрегатах»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке SQL Academy?
Да. Каждый урок SQL Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- COUNT, SUM, AVG, MIN, MAX
- GROUP BY для одного и нескольких столбцов
- HAVING и WHERE
- Распространённые ошибки: NULL в агрегатах