5.1 Mangel på betydning
SQL-språket, som Java-språket, har et spesielt nøkkelord for å angi fraværet av en verdi - det er null. Eller som det ofte skrives - NULL
.
Bruken NULL
i SQL er veldig lik bruken av null i Java. I Java kan det være objekter hvis felt inneholder nullverdier. I SQL kan det være tabeller hvis rader inneholder NULL-verdier.
La meg legge til et par umerkede produkter til produkttabellen vår med vilje. Hvis merket til produktet er ukjent, vil verdien være NULL
.
For å vise slike produkter, la oss sortere produkttabellen vår etter id i omvendt rekkefølge og ta 10 poster. Forespørselen vil se slik ut:
SELECT * FROM product
ORDER BY id DESC
LIMIT 10
Vi får følgende spørreresultat:
id | Navn | merke | pris | telle |
---|---|---|---|---|
15 | Nagle | NULL | 0,01 | 1000 |
14 | Skru | NULL | 0,10 | 1000 |
1. 3 | Stå | IKEA | 100,00 | 10 |
12 | blomsterpotte | Smartflower | 99,00 | 9 |
elleve | Lenestol | Bosch | 44,00 | 8 |
10 | Tallerken | Bosch | 199,00 | 10 |
9 | Kommode | IKEA | 99,00 | 10 |
8 | Lampe | LG | 15.00 | 100 |
7 | TV | LG | 350,00 | 4 |
6 | Hylle | Bosch | 25.00 | 114 |
Ja, jeg la nagler og skruer til bordet. De har pris og kvantitet, men ikke noe merke.
5.2 Sammenligning med NULL
Husker du at du noen ganger ble sint i Java når du brukte null? At du ikke kan sammenligne variabler som kan referere til nullverdier via equals(). Eksempel:
Product product1 = new Product();
Product product2 = null;
if (product2.equals(product1) { //an exception will be raised here
…
}
Du vil ikke tro det, men i SQL-språket venter du også på nyansene når du arbeider med NULL-verdier. Og det høres omtrent slik ut:ingenting er NULL.
Hvis du prøver å filtrere ut alle produkter som har merket null
:
SELECT * FROM product
WHERE brand = NULL
Du vil få et tomt bord:
id | Navn | merke | pris | telle |
---|
Men hvis du skriver i spørringen at merke ikke er lik NULL
, vil du få samme resultat:
SELECT * FROM product
WHERE brand != NULL
Du vil igjen få et tomt bord:
id | Navn | merke | pris | telle |
---|
Enhver sammenligning/handling med NULL vil returnere NULL:
Uttrykk | Resultat |
---|---|
merke = NULL | NULL |
merke != NULL | NULL |
NULL = NULL | NULL |
NULL != NULL | NULL |
Ja,selv om du sammenligner NULL med NULL, vil svaret være NULL.
5.3 ER NULL og ER IKKE NULL
Så hvordan sjekker vi at et felt (eller en kolonne) har en verdi på NULL
? Og for dette har SQL et spesielt uttrykk - IS NULL
. Det ser slik ut.
variable IS NULL
Hvis du vil sjekke om en kolonne i tabellen din ikke er lik NULL
, må du skrive IS NOT NULL
:
variable IS NOT NULL
La oss skrive en spørring som vil velge alle produkter fra produkttabellen hvis merke er lik NULL
. En slik forespørsel vil se slik ut:
SELECT * FROM product
WHERE brand IS NULL
Og vi får følgende spørreresultat:
id | Navn | merke | pris | telle |
---|---|---|---|---|
14 | Skru | NULL | 0,10 | 1000 |
15 | Nagle | NULL | 0,01 | 1000 |
La oss nå vise alle produktene som har en pris på mindre enn $20:
SELECT * FROM product
WHERE price < 20
Og vi får følgende spørreresultat:
id | Navn | merke | pris | telle |
---|---|---|---|---|
2 | Stol | IKEA | 5.00 | 45 |
8 | Lampe | LG | 15.00 | 100 |
14 | Skru | NULL | 0,10 | 1000 |
15 | Nagle | NULL | 0,01 | 1000 |
Nå spesifiserer vi at prisen må være mindre enn $20 og merket er ikke NULL
.
SELECT * FROM product
WHERE price < 20 AND brand IS NOT NULL
Vi får følgende spørreresultat:
id | Navn | merke | pris | telle |
---|---|---|---|---|
2 | Stol | IKEA | 5.00 | 45 |
8 | Lampe | LG | 15.00 | 100 |
Flott, de to siste linjene er borte. Slik fungerer det. Litt uvanlig, men likevel er det en viss logikk i dette.
GO TO FULL VERSION