5.1 Mancanza di significatività
Il linguaggio SQL, come il linguaggio Java, ha una parola chiave speciale per indicare l'assenza di un valore: è nullo. O come è spesso scritto - NULL
.
L'utilizzo NULL
in SQL è molto simile all'utilizzo di null in Java. In Java, potrebbero esserci oggetti i cui campi contengono valori nulli. In SQL, potrebbero esserci tabelle le cui righe contengono valori NULL.
Consentitemi di aggiungere apposta un paio di prodotti senza marchio alla nostra tabella dei prodotti. Se la marca del prodotto è sconosciuta, il valore sarà NULL
.
Per visualizzare tali prodotti, ordiniamo la nostra tabella dei prodotti per ID in ordine inverso e prendiamo 10 record. La richiesta sarà simile a questa:
SELECT * FROM product
ORDER BY id DESC
LIMIT 10
Otteniamo il seguente risultato della query:
id | nome | marca | prezzo | contare |
---|---|---|---|---|
15 | Rivetto | NULLO | 0.01 | 1000 |
14 | Vite | NULLO | 0.10 | 1000 |
13 | In piedi | IKEA | 100,00 | 10 |
12 | vaso di fiori | Fiore intelligente | 99,00 | 9 |
undici | Poltrona | Bosch | 44.00 | 8 |
10 | Piatto | Bosch | 199,00 | 10 |
9 | Costumista | IKEA | 99,00 | 10 |
8 | Lampada | LG | 15.00 | 100 |
7 | tv | LG | 350,00 | 4 |
6 | Mensola | Bosch | 25.00 | 114 |
Sì, ho aggiunto rivetti e viti al tavolo. Hanno prezzo e quantità, ma nessuna marca.
5.2 Confronto con NULL
Ricordi che a volte ti arrabbiavi con Java quando usavi null? Che non puoi confrontare variabili che possono fare riferimento a valori nulli tramite equals(). Esempio:
Product product1 = new Product();
Product product2 = null;
if (product2.equals(product1) { //an exception will be raised here
…
}
Non ci crederai, ma nel linguaggio SQL stai anche aspettando le sfumature quando lavori con valori NULL. E suona qualcosa del genere:niente è NULLO.
Se provi a filtrare tutti i prodotti il cui marchio è null
:
SELECT * FROM product
WHERE brand = NULL
Otterrai una tabella vuota:
id | nome | marca | prezzo | contare |
---|
Ma se scrivi nella query che brand non è uguale a NULL
, otterrai lo stesso risultato:
SELECT * FROM product
WHERE brand != NULL
Otterrai di nuovo una tabella vuota:
id | nome | marca | prezzo | contare |
---|
Qualsiasi confronto/azione con NULL restituirà NULL:
Espressione | Risultato |
---|---|
marca = NULLA | NULLO |
marchio != NULL | NULLO |
NULLA = NULLA | NULLO |
NULLA!= NULLA | NULLO |
SÌ,anche se confronti NULL con NULL, la risposta sarà NULL.
5.3 È NULLA e NON È NULLA
Quindi, come controlliamo che un campo (o una colonna) abbia un valore di NULL
? E per questo, SQL ha un'espressione speciale - IS NULL
. Sembra così.
variable IS NULL
Se vuoi verificare se una colonna della tua tabella non è uguale a NULL
, allora devi scrivere IS NOT NULL
:
variable IS NOT NULL
Scriviamo una query che selezionerà tutti i prodotti dalla tabella dei prodotti la cui marca è uguale a NULL
. Tale richiesta sarebbe simile a questa:
SELECT * FROM product
WHERE brand IS NULL
E otteniamo il seguente risultato della query:
id | nome | marca | prezzo | contare |
---|---|---|---|---|
14 | Vite | NULLO | 0.10 | 1000 |
15 | Rivetto | NULLO | 0.01 | 1000 |
Ora mostriamo tutti i prodotti il cui prezzo è inferiore a $ 20:
SELECT * FROM product
WHERE price < 20
E otteniamo il seguente risultato della query:
id | nome | marca | prezzo | contare |
---|---|---|---|---|
2 | Sedia | IKEA | 5.00 | 45 |
8 | Lampada | LG | 15.00 | 100 |
14 | Vite | NULLO | 0.10 | 1000 |
15 | Rivetto | NULLO | 0.01 | 1000 |
Ora specifichiamo che il prezzo deve essere inferiore a $20 e il marchio no NULL
.
SELECT * FROM product
WHERE price < 20 AND brand IS NOT NULL
Otteniamo il seguente risultato della query:
id | nome | marca | prezzo | contare |
---|---|---|---|---|
2 | Sedia | IKEA | 5.00 | 45 |
8 | Lampada | LG | 15.00 | 100 |
Fantastico, le ultime due righe sono sparite. Ecco come funziona. Un po 'insolito, ma c'è ancora una certa logica in questo.