NULL у SQL означає «невідоме значення». Будь-яке порівняння з невідомим дає теж невідоме - NULL, а не true чи false. А WHERE пропускає лише рядки, де умова true.
SELECT * FROM users WHERE deleted_at = NULL; -- завжди порожньо
SELECT * FROM users WHERE deleted_at IS NULL; -- правильно
SELECT * FROM users WHERE deleted_at IS NOT NULL;
Де ще NULL поводиться несподівано:
NULL = NULL- тежNULL. Для «рівні, з урахуванням NULL» єIS NOT DISTINCT FROMу PostgreSQL і оператор<=>у MySQL.COUNT(*)рахує всі рядки,COUNT(column)- лише ті, де значення неNULL.SUM,AVGігноруютьNULL.AVGз трьох значень, одне з якихNULL, ділить на 2.- Арифметика з
NULLдаєNULL:price * NULL. Підставити значення за замовчуванням допомагаєCOALESCE(discount, 0). WHERE status <> 'banned'не поверне рядки зіstatus IS NULL.
Порада: колонки, де значення обов'язкове, позначайте NOT NULL. Тоді питання «а що, як тут NULL» просто не виникає.