programowanieProgramista SQL

Wyjaśnij, jak działa obsługa NULL w SQL. Jakie są zagrożenia związane z nieoczekiwanymi wartościami NULL, jak należy z nimi poprawnie pracować i jakie typowe błędy występują?

Zdaj rozmowy kwalifikacyjne z asystentem AI Hintsage

Odpowiedź.

W SQL wartość NULL oznacza "nieznaną" lub "brakującą" wartość. Zachowuje się w szczególny sposób:

  • Porównanie NULL z dowolną wartością za pomocą = lub <> zawsze daje wynik UNKNOWN, a nie TRUE lub FALSE.
  • Sprawdzanie obecności NULL należy przeprowadzać za pomocą IS NULL lub IS NOT NULL.
  • Jakakolwiek operacja arytmetyczna lub logiczna z NULL da NULL.

Przykład:

SELECT * FROM users WHERE name = NULL; -- nie zwróci żadnego wiersza SELECT * FROM users WHERE name IS NULL; -- poprawne SELECT 1 + NULL; -- Wynik: NULL

Do zastępowania NULL używa się funkcji takich jak COALESCE(foo, 0) (bierze pierwszą wartość nie-NULL) lub ISNULL(foo, 'default') w SQL Server.

Pytanie z podstępem.

Pytanie: Jaki wynik zwróci warunek WHERE some_column <> 'value' w wierszach, gdzie some_column — NULL?

Odpowiedź:

W tych wierszach warunek nie zostanie spełniony: porównanie z NULL da UNKNOWN, a nie TRUE. Dlatego wiersze z NULL nie trafią do wyniku.

Przykład:

-- some_column | ... -- NULL | ... -- 'abc' | ... -- 'value' | ... SELECT * FROM table WHERE some_column <> 'value'; -- Wiersz z NULL nie trafi

Historia

W raporcie bankowym warunek WHERE status <> 'closed' omyłkowo nie uwzględniał rachunków, których wartość status to NULL (na przykład nowe wnioski). W rezultacie nieprawidłowo policzono aktywne rachunki — liczba okazała się o 15% mniejsza.

Historia

W internetowej usłudze personalizacji e-maili zapomniano dodać COALESCE(user_name, 'Szanowny kliencie') do wysyłki. Prawie tysiąc klientów otrzymało powitanie bez imienia, co odebrano jako błąd automatyzacji.

Historia

Podczas migracji bazy danych LEFT JOIN zwracał więcej wierszy, niż oczekiwano. Okazało się, że w lewej tabeli były pola z NULL; filtry typu WHERE b.field = 'X' po JOIN odrzucały te wiersze, co skutkowało utratą części danych.