5.1 Brak znaczenia

Język SQL, podobnie jak język Java, ma specjalne słowo kluczowe oznaczające brak wartości — jest to wartość null. Albo jak to się często pisze - NULL.

Użycie NULLw SQL jest bardzo podobne do użycia null w Javie. W Javie mogą istnieć obiekty, których pola zawierają wartości puste. W SQL mogą istnieć tabele, których wiersze zawierają wartości NULL.

Celowo dodam kilka niemarkowych produktów do naszej tabeli produktów. Jeśli marka produktu jest nieznana, wartość będzie wynosić NULL.

Aby wyświetlić takie produkty, posortujmy naszą tabelę produktów według id w odwrotnej kolejności i weźmy 10 rekordów. Żądanie będzie wyglądać następująco:

SELECT * FROM product
ORDER BY id DESC
LIMIT 10

Otrzymujemy następujący wynik zapytania:

ID nazwa marka cena liczyć
15 Nit ZERO 0,01 1000
14 Śruba ZERO 0,10 1000
13 Podstawka IKEA 100,00 10
12 doniczka Inteligentny kwiat 99,00 9
jedenaście Fotel Boscha 44.00 8
10 Płyta Boscha 199,00 10
9 Kredens IKEA 99,00 10
8 Lampa LG 15.00 100
7 telewizja LG 350,00 4
6 Półka Boscha 25.00 114

Tak, dołożyłem nity i śruby do stołu. Mają cenę i ilość, ale nie mają marki.

5.2 Porównanie z NULL

Czy pamiętasz, że czasami wpadałeś w szał w Javie, gdy używałeś wartości null? Że nie możesz porównywać zmiennych, które mogą odwoływać się do wartości pustych przez equals(). Przykład:

Product product1 = new Product();
Product product2 = null;
if (product2.equals(product1) {  //an exception will be raised here}

Nie uwierzysz, ale w języku SQL również czekasz na niuanse podczas pracy z wartościami NULL. A brzmi to mniej więcej tak:nic nie jest NULL.

Jeśli spróbujesz odfiltrować wszystkie produkty, których marką jest null:

SELECT * FROM product
WHERE brand = NULL

Otrzymasz pusty stół:

ID nazwa marka cena liczyć

Ale jeśli napiszesz w zapytaniu, że marka nie jest równa NULL, otrzymasz ten sam wynik:

SELECT * FROM product
WHERE brand != NULL

Ponownie otrzymasz pustą tabelę:

ID nazwa marka cena liczyć

Każde porównanie/akcja z NULL zwróci NULL:

Wyrażenie Wynik
marka = NULL ZERO
marka != NULL ZERO
NULL = NULL ZERO
NULL != NULL ZERO

Tak,nawet jeśli porównasz NULL z NULL, to odpowiedź będzie NULL.

5.3 JEST NULL i NIE JEST NULL

Jak więc sprawdzić, czy jakieś pole (lub kolumna) ma wartość NULL? W tym celu SQL ma specjalne wyrażenie - IS NULL. To wygląda tak.

variable IS NULL

Jeśli chcesz sprawdzić, czy kolumna twojej tabeli nie jest równa NULL, musisz napisać IS NOT NULL:

variable IS NOT NULL

Napiszmy zapytanie, które wybierze wszystkie produkty z tabeli produktów, których marka jest równa NULL. Taka prośba wyglądałaby tak:

SELECT * FROM product
WHERE brand IS NULL

Otrzymujemy następujący wynik zapytania:

ID nazwa marka cena liczyć
14 Śruba ZERO 0,10 1000
15 Nit ZERO 0,01 1000

Teraz wyświetlmy wszystkie produkty, których cena jest niższa niż 20 USD:

SELECT * FROM product
WHERE price  < 20

Otrzymujemy następujący wynik zapytania:

ID nazwa marka cena liczyć
2 Krzesło IKEA 5.00 45
8 Lampa LG 15.00 100
14 Śruba ZERO 0,10 1000
15 Nit ZERO 0,01 1000

Teraz określamy, że cena musi być niższa niż 20 USD, a marka nie NULL.

SELECT * FROM product
WHERE price  < 20 AND brand IS NOT NULL

Otrzymujemy następujący wynik zapytania:

ID nazwa marka cena liczyć
2 Krzesło IKEA 5.00 45
8 Lampa LG 15.00 100

Świetnie, ostatnie dwie linijki zniknęły. Oto jak to działa. Trochę niezwykłe, ale wciąż jest w tym pewna logika.