NULL в реляционных базах данных
Урок 1.6 · Время чтения: ~6 мин · Задачи для практики ↓
NULL - специальная отметка, которой реляционные базы данных обозначают отсутствующее, неизвестное или неприменимое значение. В этом уроке вы узнаете, что означает NULL, чем он не является, зачем он нужен, какие столбцы могут его содержать и почему из-за NULL база отвечает «неизвестно» вместо «да» или «нет».
В предыдущих уроках мы разобрали таблицы, строки, столбцы и типы данных. В каждой ячейке таблицы хранится значение типа её столбца - кроме случаев, когда хранить нечего.
Что означает NULL?
NULL - не значение, а отметка: она говорит, что в ячейке значения нет. Причины бывают разными: значение неизвестно, не относится к этой строке или просто ещё не появилось.
NULL в таблице
Таблица rental базы Sakila хранит аренды фильмов. Дата возврата return_date появляется только тогда, когда фильм вернули, поэтому до этого в ячейке NULL:
| rental_id | rental_date | return_date |
|---|---|---|
| 14098 | 2005-08-21 00:30:32 | NULL |
| 14469 | 2005-08-21 13:07:24 | 2005-08-24 10:37:24 |
| 14626 | 2005-08-21 18:35:44 | 2005-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 в столбцах первичного ключа.