0Pricing
SQL Academy · Lekcja

IS NULL i IS NOT NULL

Prawidłowo sprawdzaj brakujące wartości

IS NULL i IS NOT NULL to bezpłatna lekcja SQL Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej SQL Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs SQL Academy zawiera 4 lekcji w sumie.

Sprawdzanie brakujących wartości

Ponieważ porównania z NULL zawsze zwracają wynik unknown, SQL udostępnia dwa dedykowane operatory do sprawdzania brakujących wartości: IS NULL i IS NOT NULL.

Są to jedyne niezawodne sposoby wyszukiwania lub wykluczania wartości NULL. W tej lekcji nauczą się Państwo używać ich poprawnie.

-- Rows where phone is missing
SELECT name FROM customers WHERE phone IS NULL;

-- Rows where phone is present
SELECT name FROM customers WHERE phone IS NOT NULL;

Dlaczego = NULL nie działa

Kuszące może być napisanie WHERE phone = NULL, ale takie wyrażenie nigdy niczego nie dopasuje. Warunek dla każdego wiersza daje wynik unknown, a WHERE zachowuje tylko wiersze o wartości true.

Wynikiem jest pusty zbiór — to cichy błąd, ponieważ nie jest zgłaszany żaden wyjątek.

-- Always returns 0 rows, even if NULLs exist
SELECT * FROM customers WHERE phone = NULL;

-- The fix
SELECT * FROM customers WHERE phone IS NULL;

IS NULL w praktyce

IS NULL zwraca true dokładnie wtedy, gdy brakuje wartości, a w przeciwnym razie zwraca false. Nigdy nie zwraca unknown.

Dzięki temu można bezpiecznie używać go wszędzie tam, gdzie potrzebny jest jednoznaczny wynik true/false.

SELECT id, name, (phone IS NULL) AS missing_phone
FROM customers;

-- id | name  | missing_phone
-- ---+-------+--------------
--  1 | Alice | f
--  2 | Bob   | t
--  3 | Carol | t

IS NOT NULL w praktyce

IS NOT NULL działa dokładnie odwrotnie: zwraca true, gdy wartość istnieje, i false, gdy jej brakuje.

Należy używać go do filtrowania wierszy, które rzeczywiście zawierają dane, na przykład klientów, do których można zadzwonić.

SELECT name, phone
FROM customers
WHERE phone IS NOT NULL;

-- name  | phone
-- ------+----------
-- Alice | 555-0101

Łączenie za pomocą AND / OR

Można łączyć testy wartości NULL z innymi warunkami za pomocą AND i OR.

Można na przykład znaleźć aktywnych klientów, dla których nadal brakuje zapisanego numeru telefonu — jest to częste zapytanie służące do kontroli jakości danych.

SELECT id, name
FROM customers
WHERE is_active = true
  AND phone IS NULL;

-- Active customers missing a phone number

NULL w NOT IN: pułapka

NOT IN działa problematycznie, gdy lista zawiera NULL. Jeśli dowolna wartość w zbiorze jest NULL, NOT IN może zwrócić unknown dla każdego wiersza, odrzucając oczekiwane wyniki.

Należy preferować NOT EXISTS albo najpierw odfiltrować wartości NULL z podzapytania.

-- Risky: if blocked_ids contains a NULL, this returns nothing
SELECT * FROM users
WHERE id NOT IN (SELECT user_id FROM blocked);

-- Safer
SELECT * FROM users
WHERE id NOT IN (SELECT user_id FROM blocked WHERE user_id IS NOT NULL);

IS DISTINCT FROM

PostgreSQL udostępnia operatory IS DISTINCT FROM i IS NOT DISTINCT FROM — operatory porównań bezpieczne dla wartości NULL.

W przeciwieństwie do = traktują dwie wartości NULL jako równe, a wartość NULL i zwykłą wartość jako różne. Zawsze zwracają true albo false, nigdy unknown.

SELECT
  NULL IS NOT DISTINCT FROM NULL AS a, -- true: both NULL = same
  NULL IS DISTINCT FROM 5        AS b, -- true: NULL differs from 5
  5 IS DISTINCT FROM 5          AS c; -- false: same value

Porównywanie dwóch kolumn dopuszczających NULL

Podczas porównywania dwóch kolumn, które mogą zawierać NULL, zwykły operator = pomija przypadek, w którym obie kolumny mają NULL. IS NOT DISTINCT FROM poprawnie obsługuje ten przypadek.

To świetne rozwiązanie do wyszukiwania wierszy, które się nie zmieniły, nawet jeśli ich wartość jest nieznana.

-- Rows where old and new phone are 'the same',
-- counting NULL = NULL as same
SELECT id
FROM customer_changes
WHERE old_phone IS NOT DISTINCT FROM new_phone;

Zliczanie wartości NULL

Praktycznym zastosowaniem IS NULL jest kontrola jakości danych — zliczanie wierszy, w których brakuje wartości.

Należy połączyć go z FILTER (PostgreSQL) albo z wyrażeniem CASE wewnątrz COUNT, aby zliczać wartości NULL i nie-NULL obok siebie.

SELECT
  count(*) AS total,
  count(*) FILTER (WHERE phone IS NULL)     AS missing,
  count(*) FILTER (WHERE phone IS NOT NULL) AS present
FROM customers;

Sprawdzanie NULL w ograniczeniach CHECK

Testów wartości NULL można używać wewnątrz ograniczeń CHECK, aby wymuszać zasady takie jak „jeśli wiersz został wysłany, musi mieć datę wysyłki”.

Uwaga: ograniczenie CHECK jest spełnione, gdy jego warunek ma wartość true lub unknown, dlatego należy dokładnie przeanalizować przypadki związane z NULL.

CREATE TABLE orders (
  id        integer PRIMARY KEY,
  status    text NOT NULL,
  ship_date date,
  CHECK (status <> 'shipped' OR ship_date IS NOT NULL)
);

Najlepsze praktyki

Aby bezpiecznie pracować z wartościami NULL, należy przestrzegać tych zasad:

  • Zawsze należy sprawdzać wartości za pomocą IS NULL / IS NOT NULL, nigdy za pomocą = NULL.
  • Należy uważać na NOT IN w połączeniu z podzapytaniami, które mogą zwracać NULL.
  • Do porównań równości bezpiecznych dla NULL należy używać IS DISTINCT FROM.
  • Brakujące dane należy kontrolować za pomocą count(*) FILTER (...).
-- The reliable toolkit
WHERE col IS NULL
WHERE col IS NOT NULL
WHERE a IS DISTINCT FROM b
WHERE a IS NOT DISTINCT FROM b

Szybki test

Chcą Państwo znaleźć wszystkich klientów, których kolumna phone nie ma wartości. Która klauzula WHERE jest poprawna?

Podsumowanie

Poznali Państwo właściwy sposób sprawdzania brakujących wartości za pomocą IS NULL i IS NOT NULL, a także dowiedzieli się Państwo, dlaczego = NULL nigdy nie działa.

Poznali Państwo również pułapkę NOT IN, bezpieczny dla NULL operator IS DISTINCT FROM oraz sposób audytowania wartości NULL za pomocą FILTER. Następnie nauczą się Państwo zastępować wartości NULL sensownymi wartościami domyślnymi za pomocą COALESCE i NULLIF.

SELECT name FROM customers WHERE phone IS NULL;
SELECT name FROM customers WHERE phone IS NOT NULL;

Często zadawane pytania

Czy lekcja „IS NULL i IS NOT NULL” jest bezpłatna?

Tak — pełny tekst „IS NULL i IS NOT NULL” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu SQL Academy, przejdź na CoddyKit PRO. Kurs SQL Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „IS NULL i IS NOT NULL”?

Prawidłowo sprawdzaj brakujące wartości Ćwiczysz SQL Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć SQL Academy?

Nie wymagamy żadnego doświadczenia. SQL Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.

Ile czasu zajmuje lekcja „IS NULL i IS NOT NULL”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji SQL Academy?

Tak. Każda lekcja SQL Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Co naprawdę oznacza NULL
  2. IS NULL i IS NOT NULL
  3. COALESCE i NULLIF
  4. NULL w agregacjach i złączeniach
← Powrót do SQL Academy