Lekcja w formie wideo

Wstęp

W poprzednich lekcjach posługiwałem się sformułowaniem, że kolumna ma wartość. To znaczy, że przechowuje dane.

A co gdy kolumna nie zawiera danych?

Czym jest NULL?

NULL jest stanem braku wartości. A słowo NULL jest słowem zastrzeżonym języka SQL. Z uwagi na to, że NULL jest stanem jest inaczej niż wartości obsługiwany. Inaczej zapisywany, liczony i testowany. Ma dedykowane operatory i funkcje.

Obsługa NULL

Jednym z objawów innego traktowania NULL jest to, że funkcje agregujące nie liczą NULL. Stąd różne wyniki w zadaniu z poprzedniej lekcji.

Ilustracja faktu, że funkcje agregujące nie liczą NULL.

Wywołanie count(*) liczy wszystkie wiersze. Natomiast count(tablespace_name) liczy jedynie wartości różne od NULL. Sprawdź komendą:

SELECT
  count(NULL)
FROM
  dual;

Jaka liczba została zwrócona?

Konsekwencją istnienia NULL jest trójwartościowa logika języka SQL. Czyli wyrażenie logiczne może zwrócić prawdę, fałsz albo NULL. Jakakolwiek operacja z udziałem NULL zwróci NULL. Zważywszy, że NULL oznacza brak wartości czyli wartość nieznaną to cokolwiek z udziałem NULL nie może dać czegokolwiek. Na przykład cokolwiek pomnożone przez NULL da NULL:

SELECT
  2*NULL
FROM
  dual;

Wyświetlanie NULL

Zwróć uwagę jak NULL jest wyświetlany. Jeśli generujesz raport dla kogoś nie obeznanego z bazami danych może być zaskoczony widząc '(null)’.

Ilustracja pokazująca jak klient interpretuje NULL.

Nie będzie wiedzieć co oznacza w tym kontekście. Podobnie gdy wynik ten zostanie zwrócony do aplikacji. Trzeba go będzie zinterpretować. Zaznaczam, że napis '(null)’ wstawiony został przez klienta: SQL Developer. SQL*Plus nie podstawi niczego.

W Oracle masz dwie funkcje pozwalające na nadanie NULL znaczenia. Pierwszą z nich jest nvl. Przyjmuje dwa argumenty. Zwraca drugi gdy pierwszy jest NULL .

SELECT
  nvl(NULL, 'brak wartości')
FROM
  dual;

Druga funkcja – nvl2 – przyjmuje trzy argumenty. Zwraca trzeci gdy pierwszy jest NULL. Zwraca drugi argument gdy pierwszy nie jest NULL.

SELECT
  nvl2(NULL, 'jest wartość', 'brak wartości')
FROM
  dual;

Inne funkcje

Kolejnymi dwoma przydatnymi do obsługi NULL funkcjami są coalesce i nullif. Pierwsza przyjmuje nie mniej niż dwa argumeny. Zwraca pierwszy który nie jest NULL.

SELECT
  coalesce(NULL, 2 , 3) 
FROM
  dual;

Druga przyjmuje dwa parametry. Zwraca NULL gdy parametry są równe.

SELECT
  nullif(1, 1) 
FROM 
  dual;

Zwraca pierwszy parametr gdy nie są.

SELECT
  nullif(1, NULL) 
FROM
  dual;

Co ciekawe zwraca błąd gdy pierwszy z parametrów jest NULL. Sprawdź. Działa poprawnie gdy drugi z paramterów jest NULL.

Nigdy nie widziałem jej w użyciu. Jeśli znasz jakieś praktyczne zastosowanie funkcji nullif to daj proszę znać w komentarzu.

Mokrym snem programisty jest nieudokumentowana funkcja sys_op_map_nonnull. Przyjmuje jeden parametr. Użyta w taki sposób:

SELECT
  * 
FROM
  dual 
WHERE
  sys_op_map_nonnull(NULL)=sys_op_map_nonnull(NULL);

Umożliwia otrzymanie prawdy z porównania NULL do NULL. Oczywiście cokolwiek innego niż NULL także przyjmie.

Nie musisz wierzyć mi na słowo. Przetestuj samodzielnie i daj znać co otrzymujesz. Niemniej pamiętaj, że funkcja jest nieudokumentowana.

Podsumowanie

Gratuluję Ci ukończenia ósmej lekcji darmowej edycji mojego kursu 'Podstawy SQL dla użytkowników Oracle’.

Wiesz z niej czym jest NULL oraz jak należy go obsługiwać w zapytaniach. Powinien być używany jedynie w przypadkach gdy naprawdę nie ma innej możliwości. Ale to temat na nadchodzący kurs o projektowaniu relacyjnej bazy danych. Daj znać czy interesujący dla Ciebie. Jeśli programujesz to możesz myśleć o NULL jako o nieobsłużonym wyjątku.

Zadanie dla Ciebie: napisz zapytanie liczące null w kolumnie tablespace_name widoku all_tables. Podpowiadam: możesz bazować na zapytaniach z poprzedniej lekcji. Zrób zrzut ekranu i pochwal się swoim osiągnięciem na discordzie. Dedykowany serwer: Marcin Badtke – bazy danych i SQL.

Wiesz już jak obsługiwać NULL w zapytaniach. W następnej lekcji pokażę Ci jak nadawać wskazujące kontekst nazwy kolumnom wyniku oraz zbiorom danych.

Tymczasem dziękuję za ukończenie niniejszej lekcji.

Wiesz co trzeba zrobić aby nie przegapić kolejnych.

Gratuluję Ci ukończenia ósmej lekcji darmowej edycji mojego kursu 'Podstawy SQL dla użytkowników Oracle’. Skomentuj poniżej jak Ci się podobała.

Jak nadawać kontekstowe nazwy kolumnom i zbiorom danych? Pokażę Ci w następnej lekcji. Chodź.

Idź do następnej lekcji

Wróć do poprzedniej lekcji

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Wymagane pola są oznaczone *