0Pricing
SQL Academy · Lekcja

Co naprawdę oznacza NULL

Wartość nieznana, a nie zero ani pustka

Co naprawdę oznacza NULL to bezpłatna lekcja SQL Academy na CoddyKit. To lekcja 1 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.

Poznajmy NULL

NULL to sposób SQL na powiedzenie „nie wiem”. Nie jest to zero, pusty ciąg znaków ani false — oznacza brak wartości.

Gdy kolumna nie ma znanej wartości, baza danych przechowuje w niej NULL. Zrozumienie działania NULL jest jednym z najważniejszych kroków na drodze do pisania poprawnych zapytań.

-- A customers table where some phone numbers are unknown
SELECT id, name, phone
FROM customers;

-- id | name    | phone
-- ---+---------+------------
--  1 | Alice   | 555-0101
--  2 | Bob     | NULL        <- phone unknown
--  3 | Carol   | NULL

NULL to nie zero

Częstym błędem jest traktowanie NULL jak liczby 0. Te wartości są całkowicie różne.

  • 0 to znana wartość: zero.
  • NULL oznacza, że wartość brakuje lub jest nieznana.

Jeśli saldo konta wynosi 0, klient nie ma pieniędzy. Jeśli wynosi NULL, po prostu nie znamy jeszcze salda.

SELECT id, balance
FROM accounts;

-- id | balance
-- ---+--------
--  1 | 0        <- known: empty wallet
--  2 | NULL     <- unknown: not recorded yet

NULL to nie pusty ciąg znaków

W przypadku kolumn tekstowych NULL i pusty ciąg znaków '' również się różnią.

  • '' to ciąg znaków o długości zero — znana, istniejąca wartość.
  • NULL oznacza, że nie podano żadnego ciągu znaków.

Można celowo zapisać pustą notatkę albo całkowicie jej nie podać. SQL rozróżnia te przypadki.

SELECT id, note, length(note) AS note_len
FROM tickets;

-- id | note | note_len
-- ---+------+----------
--  1 | ''   |        0   <- empty but present
--  2 | NULL |     NULL   <- absent; length is also unknown

Logika trójwartościowa

W zwykłej logice występują dwa wyniki: true i false. SQL dodaje trzeci: nieznany.

Każde porównanie obejmujące NULL daje wynik unknown, ponieważ nie można porównać wartości, której się nie posiada. Nazywa się to logiką trójwartościową.

-- Each comparison with NULL returns UNKNOWN, not true/false
SELECT
  NULL = 5      AS eq,      -- unknown
  NULL <> 5     AS neq,     -- unknown
  NULL = NULL   AS self_eq, -- unknown (!)
  NULL > 0      AS gt;      -- unknown

NULL = NULL nie daje wyniku true

Najbardziej zaskakująca zasada brzmi: NULL = NULL nie daje wyniku true. Wynikiem jest unknown.

Dlaczego? Jeśli obie wartości są nieznane, nie można stwierdzić, że są równe — mogą oznaczać cokolwiek. Aby sprawdzić, czy coś jest NULL, należy użyć IS NULL zamiast =.

-- Wrong: never returns rows, because NULL = NULL is unknown
SELECT * FROM customers WHERE phone = NULL;

-- Right: use IS NULL
SELECT * FROM customers WHERE phone IS NULL;

WHERE zachowuje tylko wiersze TRUE

Klauzula WHERE zachowuje wiersz tylko wtedy, gdy jej warunek ma wartość true. Wiersze, dla których warunek ma wartość false lub unknown, są odrzucane.

Dlatego filtrowanie kolumny zawierającej NULL za pomocą = po cichu usuwa wiersze, które można by oczekiwać zobaczyć.

-- Bob and Carol have NULL phones, so phone = '555-0101'
-- is UNKNOWN for them and they are excluded.
SELECT name
FROM customers
WHERE phone = '555-0101';

-- Returns only Alice

NULL propaguje się w działaniach arytmetycznych

NULL jest zaraźliwy w wyrażeniach. Niemal każda operacja arytmetyczna lub tekstowa obejmująca NULL zwraca NULL.

Jeśli jedna z wartości wejściowych jest nieznana, wynik również nie może być znany.

SELECT
  10 + NULL    AS sum,    -- NULL
  100 * NULL   AS prod,   -- NULL
  NULL / 2     AS div,    -- NULL
  'Hi ' || NULL AS greet; -- NULL (string concat)

Skąd biorą się wartości NULL

Wartości NULL pojawiają się w kilku typowych sytuacjach:

  • Instrukcja INSERT pomija kolumnę, która dopuszcza wartość NULL.
  • Łączenie zewnętrzne, gdy po jednej stronie nie ma pasującego wiersza.
  • Agregacja nad zerową liczbą wierszy, na przykład SUM pustego zbioru zwraca NULL.

Znajomość źródła pomaga zdecydować, jak sobie z nimi poradzić.

-- Omitting phone inserts NULL automatically
INSERT INTO customers (id, name) VALUES (4, 'Dan');

SELECT id, name, phone FROM customers WHERE id = 4;
-- 4 | Dan | NULL

Zapobieganie NULL: NOT NULL

Jeśli kolumna powinna zawsze zawierać wartość, należy zadeklarować ją jako NOT NULL. Baza danych odrzuci wtedy każdy wiersz, który próbuje pozostawić ją pustą.

To skuteczny sposób na utrzymanie czystości danych i uniknięcie niespodzianek związanych z NULL w przyszłości.

CREATE TABLE users (
  id    integer PRIMARY KEY,
  email text NOT NULL,   -- must always be provided
  bio   text             -- nullable: optional
);

-- This fails: email cannot be NULL
INSERT INTO users (id, bio) VALUES (1, 'hi');

NULL a DISTINCT / GROUP BY

Istnieje jedno miejsce, w którym SQL traktuje wartości NULL jako równe: grupowanie i usuwanie duplikatów.

W DISTINCT i GROUP BY wszystkie wartości NULL są umieszczane w jednej grupie, mimo że w innych sytuacjach NULL = NULL daje wynik unknown. Ten szczególny przypadek sprawia, że grupowanie pozostaje użyteczne.

SELECT phone, count(*)
FROM customers
GROUP BY phone;

-- phone    | count
-- ---------+------
-- 555-0101 |     1
-- NULL     |     2   <- all NULLs grouped together

Podsumowanie modelu mentalnego

Za każdym razem, gdy pojawia się NULL, należy pamiętać o tych zasadach:

  • NULL oznacza wartość nieznaną, a nie zero lub pustą wartość.
  • Porównania z NULL dają wynik unknown — należy używać IS NULL / IS NOT NULL.
  • WHERE zachowuje tylko wiersze o wartości true.
  • Działania arytmetyczne z NULL dają NULL.
  • Grupowanie traktuje wartości NULL jako jedną grupę.
-- The two correct NULL tests
SELECT name FROM customers WHERE phone IS NULL;
SELECT name FROM customers WHERE phone IS NOT NULL;

Szybkie sprawdzenie

Jaki wynik w standardowym SQL daje wyrażenie NULL = NULL?

Podsumowanie

Wiedzą już Państwo, czym naprawdę jest NULL: oznaczeniem brakującej lub nieznanej wartości, różniącej się od 0 i ''.

Poznali Państwo logikę trójwartościową SQL, dowiedzieli się, dlaczego = NULL nigdy nie działa, jak NULL propaguje się w działaniach arytmetycznych oraz jak WHERE odrzuca wiersze o nieznanym wyniku. Następnie poznają Państwo poprawny sposób sprawdzania wartości NULL za pomocą IS NULL i IS NOT NULL.

-- Remember the golden rule
SELECT * FROM customers WHERE phone IS NULL;     -- correct
-- SELECT * FROM customers WHERE phone = NULL;   -- always empty!

Często zadawane pytania

Czy lekcja „Co naprawdę oznacza NULL” jest bezpłatna?

Tak — pełny tekst „Co naprawdę oznacza 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 „Co naprawdę oznacza NULL”?

Wartość nieznana, a nie zero ani pustka Ć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 1 z 4.

Ile czasu zajmuje lekcja „Co naprawdę oznacza 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