NULL: няма стойност
Проблем
Клиентът, който изчезна
Маркетингът иска да пише на всички клиенти извън София. В базата има 20 клиента, 6 от тях са от София. Очакваш 14:
Излизат 13. Кой липсва? Борис Митев, който не е казал от кой град е. Не е от София, а го няма в резултата.
Идеята
Неизвестно
Градът на Борис е NULL: липса на стойност. Не е празен текст и не е нула. Значи „не знаем“.
Затова SQL работи с три отговора: вярно, невярно и неизвестно. „Градът на Борис различен ли е от София?“ Не знаем, градът му е неизвестен. Отговорът е „неизвестно“, а WHERE пази само редовете, за които е вярно.
Същото става и при търсене на NULL с =:
Нищо. NULL = NULL също е „неизвестно“: две неизвестни стойности може да са еднакви, а може и да не са.
Идеята
IS NULL
За NULL има отделна проверка: IS NULL, и обратната ѝ IS NOT NULL.
Това е единственият верен начин. = NULL е грешка, която не дава съобщение, а просто празен резултат.
Пробвай
Без категория
Покажи името и цената на продуктите, които нямат категория. Полето вече има един опит. Пусни го и го поправи.
Решение
SELECT name, price FROM products WHERE category_id IS NULL;WHERE category_id IS NULL: подаръчната карта. Тя не е нито храна, нито стока за дома.
Пробвай
Всички извън София
Поправи заявката от началото на урока: всички клиенти извън София, и тези без град.
Решение
SELECT name, city FROM customers
WHERE city <> 'София' OR city IS NULL;WHERE city <> 'София' OR city IS NULL. Сега са 14, с Борис. Когато колона може да е NULL, при всяко „различно от“ се питай къде отиват празните.
Виж го
NOT IN и един NULL
Списък в NOT IN, в който има NULL, връща празен резултат:
Защо? city NOT IN ('София', NULL) значи city <> 'София' AND city <> NULL. Второто е винаги „неизвестно“, значи цялото условие никога не е вярно.
На ръка рядко ще напишеш NULL в списък. Но когато списъкът идва от друга заявка, а там има NULL, ще получиш празен отчет без никаква грешка. Ще го срещнем пак при подзаявките.
Упражнение
Продуктите в категория
Покажи името и категорията на всички продукти, които имат категория.
Решение
SELECT name, category_id FROM products WHERE category_id IS NOT NULL;WHERE category_id IS NOT NULL. 24 продукта, всички освен подаръчната карта.
Тест