🚀 Начался ноябрь! SQLtest.online остаётся бесплатным благодаря донатам таких людей, как вы. Помогите собрать сумму этого месяца пораньше, чтобы сайт работал без перебоев. Поддержать сейчас →
SQL код скопирован в буфер обмена

NULL в реляционных базах данных

Урок 1.6 · Время чтения: ~6 мин · Задачи для практики ↓

NULL - специальная отметка, которой реляционные базы данных обозначают отсутствующее, неизвестное или неприменимое значение. В этом уроке вы узнаете, что означает NULL, чем он не является, зачем он нужен, какие столбцы могут его содержать и почему из-за NULL база отвечает «неизвестно» вместо «да» или «нет».

В предыдущих уроках мы разобрали таблицы, строки, столбцы и типы данных. В каждой ячейке таблицы хранится значение типа её столбца - кроме случаев, когда хранить нечего.

Иллюстрация: NULL как отсутствующее или неизвестное значение в столбцах реляционной базы данных

Что означает NULL?

NULL - не значение, а отметка: она говорит, что в ячейке значения нет. Причины бывают разными: значение неизвестно, не относится к этой строке или просто ещё не появилось.

NULL в таблице

Таблица rental базы Sakila хранит аренды фильмов. Дата возврата return_date появляется только тогда, когда фильм вернули, поэтому до этого в ячейке NULL:

rental_idrental_datereturn_date
140982005-08-21 00:30:32NULL
144692005-08-21 13:07:242005-08-24 10:37:24
146262005-08-21 18:35:442005-08-25 23:54:44

Аренду 14098 ещё не вернули: даты возврата пока не существует. Это не «ноль» и не «пустая дата» - там просто ничего нет.

Чем NULL не является

  • NULL - не 0. Ноль - настоящее число: цена 0 означает «бесплатно», а цена NULL - «цена неизвестна».
  • NULL - не пустая строка. '' - текст без символов, это известное значение. NULL означает, что текста нет вовсе.
  • NULL - не слово 'NULL'. Текст 'NULL' - обычная строка из четырёх букв.
  • NULL - не false. В логике баз данных NULL означает «неизвестно», а не «нет».

Зачем базам данных NULL?

Без NULL каждое отсутствующее значение пришлось бы заменять выдуманной заглушкой вроде 0, '' или 1900-01-01, и такие заглушки путаются с настоящими данными. NULL честно описывает типичные случаи:

  • Неизвестно: клиент не указал телефон.
  • Неприменимо: у частного лица нет ИНН компании.
  • Ещё не известно: у аренды нет даты возврата, пока фильм не вернули.

Какие столбцы могут содержать NULL?

Допускает ли столбец NULL, решают при проектировании таблицы. Столбец, объявленный NOT NULL, всегда должен иметь значение: в rental дата аренды rental_date обязательна, а return_date может оставаться пустой. Первичный ключ никогда не бывает NULL: строку всегда нужно уметь опознать.

Хорошее правило: разрешайте NULL только там, где отсутствие значения действительно имеет смысл, а всё остальное помечайте NOT NULL.

NULL в вычислениях

Если в выражении участвует NULL, результат обычно тоже NULL: неизвестное значение делает неизвестным весь результат.

  • 10 + NULL - это NULL.
  • 5 * NULL - это NULL.
  • Число дней между датой аренды и датой возврата, равной NULL, - тоже NULL: аренда ещё не закончилась.

Трёхзначная логика

Обычно условие либо истинно, либо ложно. С NULL появляется третий ответ - UNKNOWN («неизвестно»). Вернули ли аренду 14098 до 25 августа? Дата возврата неизвестна, поэтому честный ответ - «неизвестно».

То же при сравнении NULL с NULL: про два неизвестных значения нельзя сказать, что они равны, поэтому NULL = NULL - тоже UNKNOWN, а не истина. Поэтому в базах данных для NULL есть специальные проверки вместо обычных сравнений - вы будете использовать их, когда начнёте писать запросы.


Ключевые выводы:

  • NULL отмечает отсутствующее значение: неизвестное, неприменимое или ещё не известное.
  • NULL - не 0, не пустая строка, не текст 'NULL' и не false.
  • Столбцы с NOT NULL и первичные ключи не могут содержать NULL; остальные могут.
  • Вычисления с NULL обычно дают NULL.
  • Сравнения с NULL дают третий логический результат - UNKNOWN; даже NULL = NULL - это UNKNOWN.

Часто задаваемые вопросы

NULL - это то же самое, что пустая строка?

Нет. Пустая строка '' - известное текстовое значение без символов. NULL означает, что значения нет вовсе.

Равен ли NULL значению NULL?

Не в обычном смысле. Каждый NULL обозначает неизвестное значение, а про два неизвестных значения нельзя доказать, что они равны, поэтому сравнение NULL с NULL даёт UNKNOWN.

Может ли любой столбец содержать NULL?

Столбец любого типа - числовой, текстовый или дата - может хранить NULL, если таблица не запрещает это через NOT NULL. Столбцы первичного ключа NULL никогда не принимают.

Вопросы на собеседовании

Как объяснить NULL на собеседовании?

NULL - это отметка отсутствующего значения: неизвестного, неприменимого или ещё не известного. Это не ноль, не пустая строка и не false, и у NULL свои правила: вычисления с NULL дают NULL, а сравнения с ним - UNKNOWN.

Что такое трёхзначная логика?

В SQL условие может быть TRUE, FALSE или UNKNOWN. UNKNOWN появляется всякий раз, когда в сравнении участвует NULL: база данных не может сказать, удовлетворяет ли неизвестное значение условию.

Почему первичный ключ не может быть NULL?

Первичный ключ опознаёт строку. Неизвестный идентификатор этого не может: две строки с ключом NULL было бы невозможно различить, поэтому базы данных не допускают NULL в столбцах первичного ключа.

Попробуйте решить следующие задачи, чтобы закрепить материал этого урока.

  1. В каких ячейках будет NULL?
  2. Вычисления с NULL
  3. NULL значения в базе данных