NULL, ноль и undefined в SQL: чем различаются и как с ними работать
Есть три вида пустоты. Ну вот какая между ними разница?


Иллюстрация: Оля Ежак для Skillbox Media
Ноль, пустота и неопределённость — в жизни подобные слова можно считать синонимами, но в программировании за ними скрыт разный смысл. Это три разных значения: 0, NULL и undefined. Ноль — просто ноль, пустота — NULL, а неопределённость — undefined. В статье на примере языка SQL мы разберём разницу между нулём и NULL. А вот для понимания undefined нам понадобится JavaScript. Запутанно? Сейчас по порядку во всём разберёмся.
Содержание
Рекомендации для лучшего усвоения темы
Это подготовительный раздел, который разбит на две части. В первой части собрана теория по базам данным и языку SQL, а во второй есть ссылка на платформу для практики. Если вы новичок, рекомендуем сначала изучить предложенные материалы, а затем искать различия между нулём, NULL и undefined. Иначе примеры кода в этой статье вам могут быть непонятны.
Познакомьтесь с основами SQL
SQL, или Structured Query Language, — это язык для работы с реляционными базами данных. Эти базы представлены в виде связанных таблиц, в которых информация разложена по колонкам и строкам. В них можно хранить отчёты, банковские транзакции, контакты клиентов, накладные и прочие сведения.
Если вы не слышали о базах данных и SQL — вот ознакомительные статьи:
Для закрепления прочитанного посмотрите вебинар по основам языка SQL. Спикер — Мкртич Пудеян, специалист по анализу данных в Газпромбанке.
Видео: «Skillbox Программирование»
Зарегистрируйтесь на платформе Oracle Live SQL
Oracle Live SQL — это бесплатная онлайн-платформа, на которой вы можете учиться писать запросы и работать с базами данных. Достаточно перейти на сайт oracle.com, зарегистрироваться и верифицировать электронную почту.
После регистрации вы попадёте в рабочее пространство и сможете сразу проверить подключение. Для этого введите любую SQL-команду и убедитесь, что после неё отображается выбранная таблица. Пример одной из команд:
SELECT * FROM hr.employees;

Скриншот: Oracle Corporation
Что такое ноль в SQL
Представьте миску с абрикосами. Если вы их съедите, то миска опустеет и в ней будет ноль абрикосов. Ноль здесь будет числовым эквивалентом отсутствия чего-либо и нужен для арифметических или логических операций.
В арифметических операциях ноль можно вычитать и складывать с другими числами — значение этих чисел при этом не изменится. Ещё можно умножить или разделить любое число на ноль, но в результате это даст ноль:
SELECT 5 + 0 AS result FROM DUAL
UNION ALL
SELECT 10 * 0 AS result FROM DUAL
UNION ALL
SELECT 0 / 1 AS result FROM DUAL
UNION ALL
SELECT 10 - 0 AS result FROM DUAL;

Скриншот: Oracle Corporation
В логических операциях ноль обозначает ложное значение — false. При этом любое другое число будет отвечать за правдивые значения — true.
Создадим таблицу с данными о сотрудниках компании:
CREATE TABLE employees (
id INT PRIMARY KEY,
name VARCHAR2(100),
is_active NUMBER(1)
);
Добавим в таблицу информацию о действующих и уволенных сотрудниках:
INSERT INTO employees (id, name, is_active) VALUES (1, 'Катя', 1);
INSERT INTO employees (id, name, is_active) VALUES (2, 'Таня', 0);
INSERT INTO employees (id, name, is_active) VALUES (3, 'Женя', 1);
INSERT INTO employees (id, name, is_active) VALUES (4, 'Саша', 0);
Теперь с помощью нуля и единицы выполним несколько SQL-запросов к нашей таблице. Для начала выберем всех действующих сотрудников:
SELECT * FROM employees WHERE is_active = 1;

Скриншот: Oracle Corporation
Посмотрим список уволенных сотрудников:
SELECT * FROM employees WHERE is_active = 0;

Скриншот: Oracle Corporation
Закроем нашу компанию и обновим в базе данных статусы сотрудников:
UPDATE employees SET is_active = 0 WHERE is_active = 1;
Если теперь проверить результат, то в компании никто не работает:
SELECT * FROM employees;

Скриншот: Oracle Corporation
Что такое undefined и почему его нет в SQL
В языке JavaScript undefined относится к специальному типу данных, который указывает, что значение неопределённо. Undefined не нужно специально задавать, поскольку его интерпретатор всегда указывает автоматически.
Значение undefined проще понять на примере. Перейдите в настройки браузера, откройте вкладку Дополнительные инструменты и найдите раздел Инструменты разработчика. Вам нужно открыть вкладку Консоль.

Читайте также:
Объявим в консоли переменную, запишем в неё имя и выведем результат:
const myName = "Юлия";
myName;
/**
* Если вместо консоли вы пишете код в редакторе, то для вывода результата
* используйте команду console.log(myName);
*/
Ожидаемо мы получаем сохранённое в переменной значение:

Объявим ещё одну переменную, но добавлять в неё никакого значения пока не будем. Если вывести такую переменную в консоль, то результат будет не определён — undefined. Интерпретатор указал это значение автоматически:
let mySurname;
mySurname

Если мы заполним нашу пустую переменную значением и выведем результат в консоль, то undefined больше не будет отображаться:
mySurname = "Гаврилова";
mySurname


Читайте также:
В SQL вместо undefined используют NULL — так обозначают отсутствующие и неопределённые значения. Это предусматривает SQL-92 и другие стандарты, которые обеспечивают совместимость различных систем управления базами данных (СУБД). Отказ от undefined делает работу с базами данных более последовательной и позволяет избежать многих ошибок.
Что такое NULL и как с ним работать
NULL в SQL используется для обозначения отсутствующих данных. Создадим таблицу с именами, телефонами и факсами сотрудников. Столбцы с именем и телефоном будут у каждого, а вот факс указывать не обязательно:
CREATE TABLE CompanyContacts (
MemberID NUMBER GENERATED BY DEFAULT AS IDENTITY,
FullName VARCHAR2(100) NOT NULL,
Phone VARCHAR2(20) NOT NULL,
Fax VARCHAR2(20)
);
INSERT INTO CompanyContacts (FullName, Phone, Fax) VALUES ('Катя Иванова', '801-967-7890', '801-967-1234');
INSERT INTO CompanyContacts (FullName, Phone, Fax) VALUES ('Пётр Сидоров', '801-968-7891', NULL);
INSERT INTO CompanyContacts (FullName, Phone, Fax) VALUES ('Виктор Попов', '801-969-7892', '801-969-1235');
INSERT INTO CompanyContacts (FullName, Phone, Fax) VALUES ('Дмитрий Фёдоров', '801-970-7893', NULL);
Если мы посмотрим таблицу, то в колонке Fax у двух сотрудников будут стоять прочерки. Эти прочерки означают NULL — значение отсутствует. Если вместо Oracle Live SQL вы будете работать с другой платформой, то можете увидеть разные отображения значения NULL: в одних программах тоже будут прочерки, другие добавят надпись NULL, а третьи оставят пустые ячейки.
SELECT * FROM CompanyContacts;

Скриншот: Oracle Corporation
Поработаем с таблицей и для начала выведем всех сотрудников с факсом:
SELECT * FROM CompanyContacts WHERE Fax IS NOT NULL;

Скриншот: Oracle Corporation
Теперь отдельно посмотрим список сотрудников без факса:
SELECT * FROM CompanyContacts WHERE Fax IS NULL;

Скриншот: Oracle Corporation
Допустим, нас не устраивает, что не у всех есть факс. Купим за свой счёт недостающую технику и для удобства присвоим каждому сотруднику уникальный номер факса на основе его идентификатора из таблицы:
UPDATE CompanyContacts
SET Fax = '801-970-' || LPAD (MemberID, 4, '0');
Если сейчас посмотреть обновления, то NULL больше не встречается:
SELECT * FROM CompanyContacts;

Скриншот: Oracle Corporation
Что изучить дальше
Вы познакомились со значением NULL и знаете, чем оно отличается от нуля. Однако в статье мы рассматривали простые примеры и не вникали в детали SQL-синтаксиса. Если вам нужно с этим разобраться — рекомендуем пройти два бесплатных интерактивных руководства на платформе Oracle Live SQL.
Querying Null-valued Rows: Databases for Developers. Это руководство для изучения NULL. Вы на примерах ещё раз познакомитесь с этим значением, научитесь его правильно определять, сравнивать и использовать в функциях.

Скриншот: Oracle Corporation
Columns and Data Types: Databases for Developers. В этом руководстве вы познакомитесь со структурой таблицы и популярными типами данных: числами, строками, булевыми и двоичными значениями, датой и временем.

Скриншот: Oracle Corporation
Больше интересного про код — в нашем телеграм-канале. Подписывайтесь!