Lekcja 7: Praca z wartościami NULL

Preview Mode

You're viewing this material in preview mode. Sign up to track your progress and access all features.

Lekcja 7: Praca z wartościami NULL
Required In Progress

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):

  1. Piszemy zapytanie:

    SELECT * FROM Uczniowie WHERE Email = NULL;
  2. Baza bierze wiersz ucznia, który faktycznie nie ma e-maila (Email = NULL).
  3. Ocena warunku: WHERE NULL = NULL — czy „wartość nieznana” równa jest „wartości nieznanej”?
  4. Odpowiedź to „Nie wiem” (UNKNOWN). NULL nie jest „porównywalną” wartością, więc wynik porównania nie jest TRUE.
  5. 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 co NULL. 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żyj COUNT(*).

Krótka ściągawka

  • Sprawdzenie NULL:

    WHERE Kolumna IS NULL
  • Sprawdzenie nie-NULL:

    WHERE Kolumna IS NOT NULL
  • Nie używaj:

    WHERE Kolumna = NULL