Obsługa NULL w SQL wymaga operatorów IS NULL — wartość ta nie jest równa niczemu, także innej wartości NULL.
NULL jako brak znanej wartości w SQL
NULL w SQL oznacza brak znanej, nieustalonej albo niedostępnej wartości. Nie jest to tekst „NULL”, liczba zero, pusty tekst ani wartość logiczna FALSE. Kolumna może zawierać NULL na przykład wtedy, gdy dla danego rekordu nie podano daty zakończenia, numeru telefonu albo wyniku pomiaru. Wstawienie NULL do kolumny zależy od jej definicji: kolumna oznaczona jako NOT NULL nie może przechowywać brakującej wartości, natomiast kolumna bez tego ograniczenia może ją przyjąć, o ile nie blokują tego inne reguły.
NULL nie zachowuje się jak zwykła wartość. Wyrażenie NULL = NULL nie zwraca TRUE, ponieważ porównanie dwóch nieznanych wartości nie potwierdza, że są one identyczne. W typowej logice SQL wynik takiego porównania jest UNKNOWN. Taki sam rezultat może powstać przy porównaniu NULL z konkretną wartością, na przykład cena = NULL albo status <> NULL. Z tego powodu zwykłe operatory równości i nierówności nie służą do wyszukiwania brakujących danych.
Obecność NULL wpływa także na działania arytmetyczne i wiele funkcji. Obliczenie cena + podatek zwróci NULL, jeśli cena albo podatek ma wartość NULL, ponieważ wynik nie może być określony na podstawie niepełnych danych. Podobnie konkatenacja lub inne operacje na wyrażeniach zależą od reguł konkretnego silnika i użytej funkcji. Przed napisaniem zapytania trzeba więc ustalić, czy brak wartości ma zostać zachowany, pominięty, czy zastąpiony wartością domyślną.
IS NULL, IS NOT NULL i logika trzech wartości
Do sprawdzania braku wartości służą predykaty IS NULL oraz IS NOT NULL. Przykładowe zapytanie SELECT * FROM klienci WHERE telefon IS NULL; zwraca rekordy, w których kolumna telefon faktycznie zawiera NULL. Z kolei WHERE telefon IS NOT NULL wybiera wiersze z określoną wartością. Predykaty te nie są tym samym co operatory = i <>; ich zadaniem jest bezpośrednie sprawdzanie stanu wartości.
SQL wykorzystuje logikę trzech wartości: TRUE, FALSE i UNKNOWN. Warunek zawierający NULL często daje UNKNOWN, a nie FALSE. W klauzuli WHERE zwracane są tylko wiersze, dla których warunek ma wynik TRUE. Wiersz z wynikiem FALSE albo UNKNOWN zostaje pominięty. Dlatego zapytanie WHERE status <> 'zamknięte' nie musi zwrócić rekordów, w których status jest NULL. Aby uwzględnić także brak statusu, trzeba zapisać warunek jawnie, na przykład WHERE status <> 'zamknięte' OR status IS NULL.
Przy operatorach AND i OR wynik zależy od wszystkich części warunku. Warunek telefon IS NULL AND aktywny = TRUE wybierze tylko rekordy spełniające oba sprawdzenia. Jeżeli warunek ma mieszać test NULL z innymi filtrami, warto używać nawiasów, aby jednoznacznie określić kolejność interpretacji. Nie należy zakładać, że NULL jest automatycznie traktowany jak pusty tekst, zero lub FALSE, ponieważ takie założenie zmienia znaczenie zapytania i może prowadzić do pominięcia danych.
NULL w filtrach, złączeniach i agregacji
NULL ma szczególne znaczenie podczas złączeń tabel. Warunek ON a.identyfikator = b.identyfikator nie dopasuje dwóch wierszy, jeżeli porównywane identyfikatory są NULL, ponieważ wynik porównania jest UNKNOWN. W przypadku INNER JOIN taki wiersz nie przejdzie przez warunek złączenia. W przypadku LEFT JOIN rekord z lewej tabeli może pozostać w wyniku, a kolumny pochodzące z prawej tabeli będą miały NULL, gdy nie znaleziono dopasowania. Taki NULL może więc oznaczać brak powiązanego rekordu, a nie brak danych w tabeli źródłowej.
Funkcje agregujące często traktują NULL inaczej niż zwykłe wartości. COUNT(kolumna) zlicza wartości niebędące NULL, natomiast COUNT(*) zlicza wiersze, niezależnie od zawartości kolumn. Funkcje takie jak SUM, AVG, MIN i MAX zwykle pomijają NULL w analizowanej kolumnie, lecz wynik dla zbioru bez użytecznych wartości może być NULL. Ma to znaczenie przy raportach: średnia liczona z dostępnych pomiarów nie oznacza, że brakujące pomiary miały wartość zero.
Do kontrolowanego zastępowania NULL można wykorzystać funkcje dostępne w danym silniku, między innymi COALESCE, która zwraca pierwsze wyrażenie niebędące NULL. Przykład COALESCE(rabat, 0) może przedstawić brak rabatu jako zero w obliczeniu lub raporcie, ale nie zmienia fizycznej wartości zapisanej w tabeli. Trzeba odróżniać prezentację zastępczą od naprawy danych. Jeżeli NULL oznacza „nie ustalono”, zastąpienie go zerem może wprowadzić fałszywą informację.
Sprawdzanie zapytań i danych w komputerze użytkownika
Problemy związane z NULL często ujawniają się podczas pracy z aplikacją bazodanową na laptopie lub komputerze PC. Objawem może być pusty raport, brak wyników wyszukiwania albo niepoprawna suma, mimo że tabela zawiera odpowiednie rekordy. W pierwszej kolejności należy sprawdzić definicję kolumny, przykładowe dane oraz dokładny warunek zapytania. Warto uruchomić osobne zapytania z IS NULL i IS NOT NULL, a następnie porównać liczbę wyników z zapytaniami wykorzystującymi = lub <>.
Podczas diagnostyki trzeba również rozróżnić NULL od pustego tekstu i od wartości zapisanej jako napis „NULL”. Można to zrobić przez jawne warunki oraz analizę typu kolumny. Jeżeli aplikacja buduje zapytania dynamicznie, należy sprawdzić, czy parametr oznaczający brak wartości jest przekazywany jako rzeczywisty NULL, a nie jako tekst albo niepoprawnie złożony fragment SQL. Warto też przeanalizować filtry dodawane po LEFT JOIN, ponieważ przeniesienie warunku z klauzuli ON do WHERE może usunąć wiersze bez dopasowania i zmienić działanie złączenia.
Warszawskie Pogotowie Komputerowe zajmuje się profesjonalną naprawą laptopów, komputerów PC i ich podzespołów, a w ramach diagnostyki oprogramowania można sprawdzić konfigurację aplikacji, połączenie z bazą oraz sposób przekazywania parametrów zapytań. Przy analizie problemu potrzebne są konkretne informacje: komunikat błędu, fragment zapytania, typ używanej bazy danych oraz przykład rekordu, dla którego wynik jest nieprawidłowy. Takie dane pozwalają ustalić, czy przyczyną jest błędny test NULL, niewłaściwe złączenie, odmienna interpretacja pustej wartości czy problem poza samą bazą.