Dzisiaj lecimy dalej z NULL — niewidzialnym bohaterem baz danych. Jeśli dalej myślisz, że NULL to po prostu "nic", to masz rację, ale nie do końca. W tym wykładzie nauczysz się sprawdzać, czy w twoich danych jest NULL i co z tym zrobić. No to co, gotowy tropić brakujące wartości?
Zacznijmy od prostego przykładu — wyobraź sobie, że pracujesz z bazą sklepu internetowego. Masz tabelę zamówień, gdzie dla niektórych zamówień nie dodano komentarza, a w innych — są jakieś uwagi. Jeśli chcesz znaleźć wszystkie zamówienia z pustymi uwagami i użyjesz zwykłych porównań =, <>, możesz się zdziwić... Dlaczego? Bo NULL to specjalny przypadek!
W SQL sprawdzanie obecności lub braku NULL robimy za pomocą IS NULL i IS NOT NULL. Te operatory pomagają nam ogarnąć NULL i wyciągnąć to, co trzeba.
Sprawdzanie wartości z IS NULL
IS NULL używasz, żeby sprawdzić, czy kolumna albo wyrażenie ma wartość NULL.
SELECT *
FROM orders
WHERE comment IS NULL;
To zapytanie zwróci wszystkie wiersze, gdzie w kolumnie comment jest NULL. Przydatne, jeśli chcesz znaleźć zamówienia bez uwag.
Przykład tabeli orders:
| id | customer_name | total_amount | comment |
|---|---|---|---|
| 1 | Otto Art | 1500 | "Pilna dostawa" |
| 2 | Maria Chi | 3000 | NULL |
| 3 | Alex Lin | 2000 | '' |
| 4 | Anna Song | 5000 | NULL |
Zapytanie:
SELECT id, customer_name
FROM orders
WHERE comment IS NULL;
Wynik:
| id | customer_name |
|---|---|
| 2 | Maria Chi |
| 4 | Anna Song |
Zwróć uwagę, że wiersze z pustym stringiem '' nie są tu uwzględnione, bo '' to nie NULL.
Sprawdzanie wartości z IS NOT NULL
IS NOT NULL działa odwrotnie — sprawdza, czy wartość nie jest NULL. Na przykład, jeśli chcesz dostać wszystkie zamówienia z jakimś komentarzem:
SELECT *
FROM orders
WHERE comment IS NOT NULL;
To zapytanie zwróci tylko te wiersze, gdzie w kolumnie comment coś jest (w tym puste stringi '').
Przykład
Tabela orders zostaje taka sama.
| id | customer_name | total_amount | comment |
|---|---|---|---|
| 1 | Otto Art | 1500 | "Pilna dostawa" |
| 2 | Maria Chi | 3000 | NULL |
| 3 | Alex Lin | 2000 | '' |
| 4 | Anna Song | 5000 | NULL |
Odpalamy zapytanie:
SELECT id, customer_name, comment
FROM orders
WHERE comment IS NOT NULL;
Wynik:
| id | customer_name | comment |
|---|---|---|
| 1 | Otto Art | "Pilna dostawa" |
| 3 | Alex Lin | '' |
Zwróć uwagę, że wiersz z pustym stringiem '' jest uwzględniony. SQL traktuje to jako "niepuste".
Kiedy używać IS NULL i IS NOT NULL?
Oto kilka sytuacji:
- Filtrowanie danych: chcesz wykluczyć niepełne rekordy, gdzie czegoś brakuje.
- Obsługa błędów: czasem
NULLmoże oznaczać błąd w danych i musisz wyłapać takie wiersze. - Analiza danych: liczenie rekordów z brakującymi wartościami pomaga ogarnąć jakość danych.
Praktyczne zastosowanie
Spróbujmy kilku praktycznych zadań:
Zadanie 1: Wybierz studentów bez podanej daty urodzenia
Załóżmy, że masz tabelę students:
| id | name | birth_date |
|---|---|---|
| 1 | Otto Art | 2000-05-10 |
| 2 | Maria Chi | NULL |
| 3 | Alex Lin | 1998-12-30 |
| 4 | Anna Song | NULL |
Zapytanie:
SELECT name
FROM students
WHERE birth_date IS NULL;
Wynik:
| name |
|---|
| Maria Chi |
| Anna Song |
To zapytanie jest spoko, żeby znaleźć studentów, którym trzeba dopisać datę urodzenia.
Zadanie 2: Wybierz zamówienia z komentarzami
| id | customer_name | total_amount | comment |
|---|---|---|---|
| 1 | Otto Art | 1500 | "Pilna dostawa" |
| 2 | Maria Chi | 3000 | NULL |
| 3 | Alex Lin | 2000 | '' |
| 4 | Anna Song | 5000 | NULL |
Dla tabeli orders możemy znaleźć zamówienia z uzupełnionymi komentarzami:
SELECT customer_name, comment
FROM orders
WHERE comment IS NOT NULL;
Wynik:
| customer_name | comment |
|---|---|
| Otto Art | "Pilna dostawa" |
| Alex Lin | '' |
Porównanie ze zwykłymi operatorami
Teraz zróbmy krok w bok i spróbujmy wykonać "błędne" zapytanie do sprawdzenia NULL:
SELECT *
FROM orders
WHERE comment = NULL;
Zdziwiony? Zapytanie nie zwróci żadnych wierszy, nawet tych, gdzie comment to ewidentnie NULL. To dlatego, że NULL nie porównujesz zwykłymi operatorami. Do takich porównań musisz użyć IS NULL.
GO TO FULL VERSION