CodeRang
Темы SQL

NULL SQL: COALESCE, IS NULL и работа с пустыми значениями

NULL SQL обозначает отсутствие известного значения и требует специальной логики сравнения. Разберём COALESCE SQL, IS NULL, поведение агрегатов и NULLIF на одном практическом запросе.

Обновлено · Команда SQL Arena

Что потренируете

  • Проверять отсутствующие значения через IS NULL
  • Подставлять значения с помощью COALESCE
  • Понимать поведение NULL в сравнениях и агрегатах
  • Использовать NULLIF для безопасного деления
  • Обрабатывать NULL, появившийся после LEFT JOIN

Пример задачи в тренажёре

Так выглядит задача в SQL Arena: условие, редактор, результат и схема базы.

Пред.След.Случайная
ЗаданиеОтправкиAI Mentor
Посчитать платежи и процент использования лимита

Для каждого аккаунта верните owner_name, total_paid и limit_used_pct. Если платежей нет или все их суммы NULL, total_paid должен быть 0. Процент рассчитайте как сумму платежей относительно credit_limit. При нулевом лимите результат процента должен быть NULL.

Запрос 1PostgreSQLv16
SELECT a.owner_name,
       COALESCE(SUM(p.amount), 0) AS total_paid,
       ROUND(COALESCE(SUM(p.amount), 0) / NULLIF(a.credit_limit, 0) * 100, 1) AS limit_used_pct
FROM accounts a
LEFT JOIN payments p ON p.account_id = a.id
GROUP BY a.id, a.owner_name, a.credit_limit
ORDER BY total_paid DESC, a.owner_name;
Отправить
Результатaccountspayments
Ответ принят

Как NULL, COALESCE и IS NULL работают в SQL

LEFT JOIN оставляет в результате все аккаунты, даже если подходящей строки в payments нет. Поэтому Olivia не исчезает: поля присоединённой таблицы для неё становятся NULL. Кроме того, NULL уже хранится в amount у некоторых платежей. Это разные источники отсутствующего значения, но SUM обрабатывает их одинаково: отдельные NULL он не складывает. Если же ненулевых значений вообще нет, SUM возвращает NULL, а не 0.

COALESCE(SUM(p.amount), 0) превращает такой итоговый NULL в ноль. Для Olivia это означает отсутствие платежей, а для Rita — отсутствие известной суммы среди найденных платежей. В реальной модели эти ситуации могут иметь разный бизнес-смысл, но условие задачи просит одинаковый числовой результат. Важно, что COALESCE возвращает первый аргумент, который не равен NULL; это не специальная функция только для чисел.

В проценте появляется ещё одна проблема: у Noah credit_limit равен нулю. Деление на ноль завершило бы запрос ошибкой. NULLIF(a.credit_limit, 0) сравнивает два аргумента и возвращает NULL, если они равны. Деление числа на NULL даёт NULL, поэтому запрос безопасно возвращает неизвестный процент. Это хороший пример трёхзначной логики SQL: NULL означает неизвестное значение, а сравнения вида column = NULL не работают как обычное равенство.

NULL нельзя корректно проверять через = NULL или <> NULL, потому что обычное сравнение с неизвестным значением не даёт TRUE. Для проверки используют IS NULL и IS NOT NULL. COALESCE возвращает первое значение из списка, которое не равно NULL, поэтому выражение COALESCE(total, 0) удобно для подстановки значения по умолчанию. При этом замена NULL на ноль меняет смысл данных и должна быть осознанной. Агрегатные функции вроде SUM и AVG обычно игнорируют отдельные NULL, но если подходящих ненулевых значений нет, результат агрегата может быть NULL.

SQLPostgreSQL v16
SELECT a.owner_name,
       COALESCE(SUM(p.amount), 0) AS total_paid,
       ROUND(COALESCE(SUM(p.amount), 0) / NULLIF(a.credit_limit, 0) * 100, 1) AS limit_used_pct
FROM accounts a
LEFT JOIN payments p ON p.account_id = a.id
GROUP BY a.id, a.owner_name, a.credit_limit
ORDER BY total_paid DESC, a.owner_name;
Результат запроса
owner_nametotal_paidlimit_used_pct
Mia200.0040.0
Paul175.0070.0
Noah100.00NULL
Olivia00.0
Rita00.0

Ошибки при работе с NULL в SQL

01

Проверять NULL через = NULL

Условие amount = NULL не становится TRUE даже для отсутствующего значения, потому что результат такого сравнения неизвестен. Для проверки используют amount IS NULL, а для противоположного случая — IS NOT NULL.

02

Считать, что SUM всегда возвращает 0

SUM игнорирует отдельные NULL, но если после фильтрации или соединения не осталось ни одного известного числового значения, агрегат возвращает NULL. Если по условию нужен именно ноль, его следует задать явно через COALESCE.

03

Подменять NULL нулём слишком рано

NULL и 0 не всегда означают одно и то же. Неизвестная сумма платежа может отличаться от подтверждённой суммы 0. COALESCE стоит применять там, где бизнес-правило действительно разрешает считать отсутствие значения нулём.

Задачи по теме в тренажёре

Курс «SQL с нуля»

Практика NULL в SQL полезнее, когда источник отсутствующего значения каждый раз меняется. В SQL Arena есть бесплатная задача, где отзывы без оценки нужно исключить, а пустой комментарий заменить заглушкой. В другой задаче требуется найти клиентов без заказов, а в задаче про страницы без лайков NULL появляется из-за отсутствия связанной строки. Такие примеры заставляют выбирать между IS NULL, COALESCE и логикой соединения, а не механически вставлять одну функцию. В более сложных задачах встречаются отсутствующие параметры, телефоны и значения после загрузки данных. Всего в тренажёре 1 192 задачи для PostgreSQL, MySQL, ClickHouse и BigQuery. Ответ проверяется на скрытых данных, поэтому запрос с ошибочным сравнением через = NULL не пройдёт только потому, что случайно дал правильный результат на видимых строках. На бесплатном тарифе без карты доступны 292 задачи для всех четырёх диалектов. Базовую работу с NULL, выражениями и соединениями можно последовательно закрепить в курсе «SQL с нуля», где после теории в каждом уроке есть практика.

Справочник по теме

Подробные статьи с синтаксисом и примерами в справочнике SQL Arena.

Частые вопросы

Что такое NULL SQL?

NULL в SQL означает отсутствие известного значения. Это не ноль, не пустая строка и не специальное текстовое значение.

Как работает COALESCE SQL?

COALESCE проверяет аргументы слева направо и возвращает первый аргумент, который не равен NULL. Если все аргументы равны NULL, результат тоже будет NULL.

Как проверить IS NULL SQL?

Для проверки отсутствующего значения используют выражение column IS NULL. Для обратной проверки применяют column IS NOT NULL.

Почему нельзя писать = NULL в SQL?

Сравнение с NULL через оператор = не возвращает TRUE, потому что NULL представляет неизвестное значение. Для таких проверок предназначены IS NULL и IS NOT NULL.

Чем NULL отличается от 0 в SQL?

0 — конкретное числовое значение, а NULL означает, что значение отсутствует или неизвестно. Подмена NULL нулём допустима только тогда, когда это соответствует смыслу данных.

Практика NULL и COALESCE SQL

В SQL Arena можно потренировать разные источники NULL: отсутствующие данные, результаты LEFT JOIN, агрегаты и вычисления. Запрос выполняется в браузере и проверяется на скрытых данных. Если результат непонятен, доступны ER-диаграммы, EXPLAIN и подсказки AI-ментора.

Перейти к задачам на NULL