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.
GO TO FULL VERSION