NULL в SQL: IS NULL и COALESCE
Пустая графа в картотеке — не «ноль» и не «отсутствует». Это призрак: неизвестно. И призрак ведёт себя не так, как вы ждёте ни от нуля, ни от пустой строки.
Обычная логика знает ДА и НЕТ. Здесь есть третье — НЕИЗВЕСТНО. Сравнение с призраком никогда не даёт ни ДА, ни НЕТ — только «неизвестно», и строка вылетает из выдачи молча.
WHERE phone = NULL
-- всегда пусто, ошибки нет — просто тишина
WHERE phone IS NULL
-- вот так призрака действительно находят«= NULL не спрашивает „это призрак?“. Он спрашивает „равно ли неизвестное неизвестному“ — и получает третий ответ, не ДА и не НЕТ.»
Чем заткнуть пустую графу?
Затыкают призрака через COALESCE — берёт первое непустое значение из списка.
SELECT COALESCE(nickname, name, 'без имени') AS отображаемое
FROM contacts;А NULLIF делает призрака нарочно — если два значения равны, подставляет пустоту. Классика — защита от деления на ноль.
SELECT amount / NULLIF(count, 0) AS среднее
FROM receipts;
-- count=0 → NULLIF даёт NULL → деление не падает, просто молчитПочему запрос возвращает пусто — и никто не жалуется?
Капкан — тот же, что и в первом уроке, но здесь он бьёт сильнее: WHERE status <> 'закрыто' выбросит не только чужой статус, но и все строки, где статус вообще не заполнен. Пустая графа не отвечает „да“ вообще ни на что.
«Запрос, что всегда возвращает пусто, — не значит „никто не виноват“. Значит: вопрос задан так, что призрак прошёл сквозь него незамеченным.»
На работе призрак объясняет половину случаев «цифры не сходятся»: пропуски в данных ведут себя не как ноль, а как дыра, через которую утекает часть строк — незаметно, без единой ошибки в консоли.
Призрак есть в каждом деле архива. Найдите его первым — до того, как он тихо перепишет вам ответ.