NULL to specjalny znacznik w bazach danych, który mówi „tu nie ma wartości” albo „wartość jest nieznana”. To nie jest zero, nie jest pusty ciąg znaków (''), nie jest też spacja ani false. NULL oznacza brak jakiejkolwiek danej w danym polu — pustkę, o której nic nie wiesz. W standardzie SQL traktuje się go jako oznaczenie nieobecności wartości, a nie jako wartość samą w sobie.
Najważniejsze, co musisz zrozumieć: NULL nie jest równy niczemu, nawet samemu sobie. Dlatego NULL = NULL nie zwraca true, tylko… NULL. SQL operuje na logice trójwartościowej (three-valued logic): wynik porównania może być prawdą, fałszem albo nieznany (unknown). To dlatego do sprawdzania pustki używasz IS NULL i IS NOT NULL, a nie = NULL. Ta druga konstrukcja nie wywali błędu, ale zawsze zwróci pusty zbiór i będziesz się zastanawiać, czemu zapytanie „nie działa”.
Po co to komu
NULL przydaje się, gdy dana po prostu jeszcze nie istnieje albo nie ma sensu. Klient nie podał numeru telefonu? phone = NULL. Zamówienie nie zostało jeszcze opłacone? paid_at = NULL. Wstawienie tam zera albo pustego stringa kłamałoby — sugerowałoby, że dana istnieje i ma konkretną postać. NULL uczciwie mówi: „nie wiem”.
Przykład z praktyki
Załóżmy tabelę users z kolumną last_login. Chcesz znaleźć tych, którzy nigdy się nie zalogowali:
SELECT name FROM users WHERE last_login IS NULL;
A gdy liczysz średnią z kolumny, w której są NULL-e, np. AVG(salary), to funkcje agregujące po prostu pomijają NULL-e — nie liczą ich jako zera. To samo z COUNT(column), który zliczy tylko wiersze z wartością, w przeciwieństwie do COUNT(*). Jeśli chcesz podstawić wartość zastępczą, użyj COALESCE(phone, 'brak') — zwróci pierwszy argument różny od NULL.
Pułapki, na które się nadziejesz
- Konkatenacja: w wielu bazach
'Jan ' || NULLdaje NULL, a nie „Jan „. Jeden pusty fragment psuje cały string. - NOT IN z NULL: jeśli podzapytanie zwróci choć jeden NULL,
WHERE id NOT IN (...)potrafi zwrócić pusty wynik. Klasyczna zagadka na rozmowie rekrutacyjnej. - UNIQUE i NULL: w większości baz (np. PostgreSQL) kilka NULL-i w kolumnie z ograniczeniem
UNIQUEprzejdzie, bo żaden nie jest „równy” drugiemu. - Zero to nie NULL: jeśli w polu „liczba zamówień” wpiszesz 0 zamiast NULL, to twierdzisz, że klient ma zero zamówień. NULL znaczy „nie wiem, ile ma”.
Pojęcia powiązane, które warto znać obok: COALESCE i NULLIF, ograniczenie NOT NULL, klauzula DEFAULT, logika trójwartościowa (three-valued logic), IS DISTINCT FROM oraz JOIN-y, w których nadmiarowe NULL-e często psują wyniki.