0Pricing
SQL Academy · Урок

Распространённые ошибки: 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 orders

SUM для столбца со значениями 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 orders

FILTER для условного подсчета

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 — локальная установка не требуется.

Все уроки этого курса

  1. COUNT, SUM, AVG, MIN, MAX
  2. GROUP BY для одного и нескольких столбцов
  3. HAVING и WHERE
  4. Распространённые ошибки: NULL в агрегатах
← Назад к SQL Academy