Раздел 10 · Databases

NULL, трёхзначная логика и целостность

junior~15 мин

без входаВойди, чтобы отмечать прогресс, вести заметки и решать задачи в редакторе. войти

В анкете бывают пустые поля. Человек не указал телефон, или у него нет отчества, или дата увольнения ещё не наступила. В реляционной базе для таких случаев есть особая отметка NULL, и она устроена хитрее, чем кажется. Из-за неё SQL думает не «да или нет», а «да, нет или не знаю». Этот урок разбирает, что это значит, где на этом спотыкаются, и как СУБД следит за целостностью данных.

Пустая клетка в анкете

Представь, что в анкете поле «Телефон» осталось пустым. Что это значит? Вариантов несколько:

  • телефон есть, но человек его не сообщил;
  • телефона нет вообще;
  • поле к нему не относится, как «девичья фамилия» у мужчины.

Пустая клетка не говорит, какой вариант верный. Она говорит только одно: значения здесь нет, и мы не знаем, каким оно было бы.

NULL это и есть такая пустая клетка. Важно: NULL это не ноль, не пустая строка '' и не false. Ноль это известное число. Пустая строка это известная строка нулевой длины. А NULL значит «значения нет».

Сравнение с неизвестным

Вот вопрос на засыпку. У Пети телефон NULL, у Ани тоже NULL. Равны ли их телефоны?

Подумай как человек: ты не знаешь ни того, ни другого номера. Может быть, равны, а может, нет. Честный ответ: «не знаю». SQL отвечает так же:

SELECT NULL = NULL;   -- результат: NULL, то есть «неизвестно»
SELECT 5 = NULL;      -- тоже неизвестно
SELECT NULL <> 5;     -- и это неизвестно

Так в SQL появляется третье логическое значение, UNKNOWN, «неизвестно». Логику с тремя значениями называют трёхзначной.

Таблицы истинности

Как работают AND, OR и NOT, если одно из значений «неизвестно»? Правило простое: представь, что UNKNOWN может оказаться и TRUE, и FALSE. Если ответ от этого не зависит, он известен. Если зависит, ответ UNKNOWN.

AND      | TRUE     FALSE    UNKNOWN
---------+--------------------------
TRUE     | TRUE     FALSE    UNKNOWN
FALSE    | FALSE    FALSE    FALSE
UNKNOWN  | UNKNOWN  FALSE    UNKNOWN

OR       | TRUE     FALSE    UNKNOWN
---------+--------------------------
TRUE     | TRUE     TRUE     TRUE
FALSE    | TRUE     FALSE    UNKNOWN
UNKNOWN  | TRUE     UNKNOWN  UNKNOWN

NOT TRUE = FALSE,  NOT FALSE = TRUE,  NOT UNKNOWN = UNKNOWN

Проверим правило. FALSE AND UNKNOWN: если хоть одна часть ложна, всё ложно, кем бы ни оказалось неизвестное. Значит, FALSE. TRUE AND UNKNOWN: всё зависит от неизвестного. Значит, UNKNOWN. С OR наоборот: TRUE OR UNKNOWN это TRUE при любом раскладе.

дальше после входа

Урок целиком открыт всем, кто вошёл. Войди по своему email, чтобы читать дальше.

Вход пока по приглашению. Если хочешь учиться, напиши Vassiliy.