Что на самом деле означает NULL
Неизвестное значение, а не ноль и не пустота
«Что на самом деле означает NULL» — бесплатный урок SQL Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения SQL Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс SQL Academy содержит 4 уроков всего.
Знакомство с NULL
NULL — способ SQL сказать «Я не знаю». Это не ноль, не пустая строка и не false — это обозначение отсутствия значения.
Когда столбец не имеет известного значения, база данных сохраняет в нём NULL. Понимание поведения NULL — один из важнейших шагов к написанию правильных запросов.
-- A customers table where some phone numbers are unknown
SELECT id, name, phone
FROM customers;
-- id | name | phone
-- ---+---------+------------
-- 1 | Alice | 555-0101
-- 2 | Bob | NULL <- phone unknown
-- 3 | Carol | NULLNULL — это не ноль
Распространённая ошибка — считать NULL числом 0. Это совершенно разные понятия.
0— известное значение: ноль.NULLозначает, что значение отсутствует или неизвестно.
Если баланс счёта равен 0, у клиента нет денег. Если он равен NULL, мы пока просто не знаем баланс.
SELECT id, balance
FROM accounts;
-- id | balance
-- ---+--------
-- 1 | 0 <- known: empty wallet
-- 2 | NULL <- unknown: not recorded yetNULL — это не пустая строка
Для текстовых столбцов NULL и пустая строка '' также различаются.
''— строка нулевой длины, то есть известное присутствующее значение.NULLозначает, что строка вообще не была предоставлена.
Вы можете намеренно сохранить пустую заметку или полностью оставить заметку отсутствующей. SQL различает эти случаи.
SELECT id, note, length(note) AS note_len
FROM tickets;
-- id | note | note_len
-- ---+------+----------
-- 1 | '' | 0 <- empty but present
-- 2 | NULL | NULL <- absent; length is also unknownТрёхзначная логика
Обычная логика имеет два результата: true и false. SQL добавляет третий: неизвестно.
Любое сравнение с участием NULL даёт результат unknown, поскольку нельзя сравнить значение с тем, которого у вас нет. Это называется трёхзначной логикой.
-- Each comparison with NULL returns UNKNOWN, not true/false
SELECT
NULL = 5 AS eq, -- unknown
NULL <> 5 AS neq, -- unknown
NULL = NULL AS self_eq, -- unknown (!)
NULL > 0 AS gt; -- unknownNULL = NULL — это не TRUE
Самое неожиданное правило: NULL = NULL — это не true. Результатом будет unknown.
Почему? Если оба значения неизвестны, нельзя утверждать, что они равны: это могут быть любые значения. Чтобы проверить, является ли что-то NULL, необходимо использовать IS NULL, а не =.
-- Wrong: never returns rows, because NULL = NULL is unknown
SELECT * FROM customers WHERE phone = NULL;
-- Right: use IS NULL
SELECT * FROM customers WHERE phone IS NULL;WHERE сохраняет только строки со значением TRUE
Конструкция WHERE сохраняет строку только тогда, когда её условие равно истине. Строки, для которых условие равно false или unknown, отбрасываются.
Поэтому фильтрация по столбцу NULL с помощью = незаметно удаляет строки, которые вы, возможно, ожидали увидеть.
-- Bob and Carol have NULL phones, so phone = '555-0101'
-- is UNKNOWN for them and they are excluded.
SELECT name
FROM customers
WHERE phone = '555-0101';
-- Returns only AliceNULL распространяется по арифметическим операциям
NULL распространяется по выражениям. Почти любая арифметическая операция или операция над строками, в которой участвует NULL, возвращает NULL.
Если одно из входных значений неизвестно, результат также невозможно узнать.
SELECT
10 + NULL AS sum, -- NULL
100 * NULL AS prod, -- NULL
NULL / 2 AS div, -- NULL
'Hi ' || NULL AS greet; -- NULL (string concat)Откуда берутся значения NULL
Значения NULL появляются в нескольких распространённых ситуациях:
- При выполнении
INSERT, в котором пропущен допускающий NULL столбец. - При внешнем соединении, если с одной стороны нет соответствующей строки.
- При агрегации нулевого числа строк, например
SUMпустого набора возвращаетNULL.
Знание источника помогает решить, как с ними обращаться.
-- Omitting phone inserts NULL automatically
INSERT INTO customers (id, name) VALUES (4, 'Dan');
SELECT id, name, phone FROM customers WHERE id = 4;
-- 4 | Dan | NULLПредотвращение NULL: NOT NULL
Если столбец всегда должен иметь значение, объявите его как NOT NULL. Тогда база данных отклонит любую строку, в которой этот столбец пытаются оставить пустым.
Это мощный способ поддерживать чистоту данных и избегать неожиданных значений NULL в дальнейшем.
CREATE TABLE users (
id integer PRIMARY KEY,
email text NOT NULL, -- must always be provided
bio text -- nullable: optional
);
-- This fails: email cannot be NULL
INSERT INTO users (id, bio) VALUES (1, 'hi');NULL и DISTINCT / GROUP BY
Есть одно место, где SQL считает значения NULL равными: при группировке и удалении дубликатов.
В конструкциях DISTINCT и GROUP BY все значения NULL объединяются в одну группу, хотя в других ситуациях NULL = NULL даёт результат unknown. Этот особый случай делает группировку полезной.
SELECT phone, count(*)
FROM customers
GROUP BY phone;
-- phone | count
-- ---------+------
-- 555-0101 | 1
-- NULL | 2 <- all NULLs grouped togetherИтоговая модель
Запомните эти правила при работе с NULL:
- NULL означает неизвестность, а не ноль и не пустое значение.
- Сравнения с NULL дают неизвестный результат — используйте
IS NULL/IS NOT NULL. WHEREсохраняет только строки со значением истина.- Арифметические операции с NULL дают NULL.
- При группировке значения NULL считаются одной группой.
-- The two correct NULL tests
SELECT name FROM customers WHERE phone IS NULL;
SELECT name FROM customers WHERE phone IS NOT NULL;Быстрая проверка
Какой результат даёт выражение NULL = NULL в стандартном SQL?
Повторение
Теперь вы понимаете, чем на самом деле является NULL: маркером пропущенного или неизвестного значения, отличным от 0 и ''.
Вы познакомились с трёхзначной логикой SQL, узнали, почему = NULL никогда не работает, как NULL распространяется по арифметическим операциям и почему WHERE отбрасывает строки с неизвестным результатом. Далее вы научитесь правильно проверять значения NULL с помощью IS NULL и IS NOT NULL.
-- Remember the golden rule
SELECT * FROM customers WHERE phone IS NULL; -- correct
-- SELECT * FROM customers WHERE phone = NULL; -- always empty!Часто задаваемые вопросы
Урок «Что на самом деле означает NULL» бесплатный?
Да — полный текст урока «Что на самом деле означает NULL» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс SQL Academy, подпишись на CoddyKit PRO. Курс SQL Academy содержит 4 уроков всего.
Чему я научусь в уроке «Что на самом деле означает NULL»?
Неизвестное значение, а не ноль и не пустота Ты практикуешь SQL Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать SQL Academy?
Предыдущий опыт не требуется. SQL Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Что на самом деле означает NULL»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке SQL Academy?
Да. Каждый урок SQL Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Что на самом деле означает NULL
- IS NULL и IS NOT NULL
- COALESCE и NULLIF
- NULL в агрегатах и объединениях