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 NULL
w 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.