В анкете бывают пустые поля. Человек не указал телефон, или у него нет отчества, или дата увольнения ещё не наступила. В реляционной базе для таких случаев есть особая отметка 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.