Поиск…
Вступление
NULL
в SQL, а также программирование в целом означает буквально «ничего». В SQL это легче понять как «отсутствие какой-либо ценности».
Важно отличить его от кажущихся пустых значений, таких как пустая строка ''
или число 0
, ни один из которых на самом деле не NULL
.
Также важно быть осторожным, чтобы не заключать NULL
в кавычки, например 'NULL'
, который разрешен в столбцах, которые принимают текст, но не является NULL
и может вызывать ошибки и неправильные наборы данных.
Фильтрация для NULL в запросах
Синтаксис фильтрации для NULL
(т.е. отсутствия значения) в блоках WHERE
несколько отличается от фильтрации для определенных значений.
SELECT * FROM Employees WHERE ManagerId IS NULL ;
SELECT * FROM Employees WHERE ManagerId IS NOT NULL ;
Обратите внимание, что поскольку NULL
не равен чему-либо, даже самому себе, используя операторы равенства = NULL
или <> NULL
(или != NULL
), всегда будет давать значение правды UNKNOWN
которое будет отклонено WHERE
.
WHERE
фильтрует все строки, что условие FALSE
или UKNOWN
и сохраняет только строки, что условие TRUE
.
Столбцы в таблицах
При создании таблиц можно объявить столбец как nullable или non-nullable.
CREATE TABLE MyTable
(
MyCol1 INT NOT NULL, -- non-nullable
MyCol2 INT NULL -- nullable
) ;
По умолчанию каждый столбец (кроме ограничений в отношении первичного ключа) имеет значение NULL, если мы явно не устанавливаем ограничение NOT NULL
.
Попытка присвоить NULL
столбцу, не допускающему null, приведет к ошибке.
INSERT INTO MyTable (MyCol1, MyCol2) VALUES (1, NULL) ; -- works fine
INSERT INTO MyTable (MyCol1, MyCol2) VALUES (NULL, 2) ;
-- cannot insert
-- the value NULL into column 'MyCol1', table 'MyTable';
-- column does not allow nulls. INSERT fails.
Обновление полей до NULL
Установка поля в NULL
работает точно так же, как и с любым другим значением:
UPDATE Employees
SET ManagerId = NULL
WHERE Id = 4
Вставка строк с полями NULL
Например, добавив сотрудника в номер таблицы « Сотрудники без номера телефона» и «нет менеджера»:
INSERT INTO Employees
(Id, FName, LName, PhoneNumber, ManagerId, DepartmentId, Salary, HireDate)
VALUES
(5, 'Jane', 'Doe', NULL, NULL, 2, 800, '2016-07-22') ;