Jak szukać rekordów, gdzie kolumna ma nieokreśloną wartość?
W SQL brak wartości oznaczamy słowem NULL. NULL to nie jest zwykła wartość — to znacznik „braku wartości” lub „wartości nieznanej”. Aby poprawnie wyszukać wiersze, w których kolumna przechowuje NULL, trzeba użyć specjalnej składni.
Dlaczego Kolumna = NULL nie działa?
To wynika z tzw. logiki trójwartościowej (Three-Valued Logic, 3VL). Standardowe operatory porównania (=, !=, <, >) wobec wartości NULL nie zwracają TRUE ani FALSE — zwracają trzeci stan logiczny: UNKNOWN (nieznany).
Przykład (krok po kroku):
Piszemy zapytanie:
SELECT * FROM Uczniowie WHERE Email = NULL;- Baza bierze wiersz ucznia, który faktycznie nie ma e-maila (Email = NULL).
- Ocena warunku: WHERE NULL = NULL — czy „wartość nieznana” równa jest „wartości nieznanej”?
- Odpowiedź to „Nie wiem” (UNKNOWN). NULL nie jest „porównywalną” wartością, więc wynik porównania nie jest TRUE.
- Klauzula WHERE przepuszcza tylko wiersze, dla których warunek jest TRUE — ponieważ mamy UNKNOWN, wiersz zostaje odrzucony.
Wniosek: zapytania typu WHERE Kolumna = NULL lub WHERE Kolumna != NULL nie zwrócą wierszy.
Operator IS NULL
To jedyny poprawny sposób na sprawdzenie, czy kolumna ma wartość NULL.
Składnia i przykład:
SELECT Imie, Nazwisko
FROM Uczniowie
WHERE Email IS NULL;Co robi to zapytanie: zwraca wszystkich uczniów, których kolumna Email zawiera NULL (czyli nie przypisano adresu e-mail).
Dodatkowe przykłady użycia IS NULL
Liczenie uczniów bez e-maila:
SELECT COUNT(*) AS BrakEmaila FROM Uczniowie WHERE Email IS NULL;Warunek na kilka kolumn:
SELECT * FROM Uczniowie WHERE Email IS NULL AND Telefon IS NOT NULL;To zwróci uczniów bez e-maila, ale posiadających numer telefonu.
Użycie w konstrukcji CASE:
SELECT Imie, Nazwisko, CASE WHEN Email IS NULL THEN 'brak' ELSE Email END AS EmailDisplay FROM Uczniowie;
Operator IS NOT NULL
Operator odwrotny do IS NULL — znajduje wiersze, w których dana kolumna ma jakąkolwiek (nie-NULL) wartość.
SELECT Imie, Nazwisko, Email
FROM Uczniowie
WHERE Email IS NOT NULL;To zapytanie zwróci uczniów, którzy mają przypisany adres e-mail.
Przykłady praktyczne
Wyświetlenie i posortowanie wyników, z obsługą NULL:
SELECT Imie, Nazwisko, Email FROM Uczniowie WHERE Email IS NOT NULL ORDER BY Nazwisko;Zastępowanie NULL przy wyświetlaniu (np. pokazywanie tekstu „brak”):
SELECT Imie, Nazwisko, COALESCE(Email, 'brak') AS EmailDisplay FROM Uczniowie;Funkcja COALESCE zwraca pierwszy nie-NULL-owy argument — przydatne do zamiany NULL na wartość domyślną.
Uwagi i dodatkowe informacje
- NULL != pusta wartość — pusty ciąg znaków ('') to wartość tekstowa;
''nie jest tym samym coNULL. Aby znaleźć puste ciągi trzeba użyćWHERE Kolumna = ''. - W niektórych systemach (np. PostgreSQL) istnieje operator
IS DISTINCT FROM, który traktuje NULL jako porównywalny — to zaawansowana opcja do porównań z uwzględnieniem NULL. - Pamiętaj, że większość standardowych funkcji agregujących (np.
COUNT(column)) ignoruje NULL. Jeśli chcesz policzyć wszystkie wiersze niezależnie od NULL, użyjCOUNT(*).
Krótka ściągawka
Sprawdzenie NULL:
WHERE Kolumna IS NULLSprawdzenie nie-NULL:
WHERE Kolumna IS NOT NULLNie używaj:
WHERE Kolumna = NULL