5.1 Manglende betydning
SQL-sproget har ligesom Java-sproget et særligt nøgleord til at angive fraværet af en værdi - det er null. Eller som det ofte bliver skrevet - NULL
.
Brugen NULL
i SQL ligner meget brugen af null i Java. I Java kan der være objekter, hvis felter indeholder null-værdier. I SQL kan der være tabeller, hvis rækker indeholder NULL-værdier.
Lad mig tilføje et par umærkede produkter til vores produkttabel med vilje. Hvis produktets mærke er ukendt, vil værdien være NULL
.
For at vise sådanne produkter, lad os sortere vores produkttabel efter id i omvendt rækkefølge og tage 10 poster. Anmodningen vil se således ud:
SELECT * FROM product
ORDER BY id DESC
LIMIT 10
Vi får følgende forespørgselsresultat:
id | navn | mærke | pris | tælle |
---|---|---|---|---|
15 | Nitte | NUL | 0,01 | 1000 |
14 | Skrue | NUL | 0,10 | 1000 |
13 | Stå | IKEA | 100,00 | 10 |
12 | blomsterkrukke | Smartflower | 99,00 | 9 |
elleve | Lænestol | Bosch | 44,00 | 8 |
10 | Plade | Bosch | 199,00 | 10 |
9 | Kommode | IKEA | 99,00 | 10 |
8 | Lampe | LG | 15.00 | 100 |
7 | TV | LG | 350,00 | 4 |
6 | Hylde | Bosch | 25.00 | 114 |
Ja, jeg tilføjede nitter og skruer til bordet. De har pris og mængde, men intet mærke.
5.2 Sammenligning med NULL
Kan du huske, at du nogle gange blev sur i Java, når du brugte null? At du ikke kan sammenligne variabler, der kan referere til nulværdier 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-sproget venter du også på nuancerne, når du arbejder med NULL-værdier. Og det lyder sådan her:intet er NULL.
Hvis du forsøger at bortfiltrere alle produkter, hvis mærke er null
:
SELECT * FROM product
WHERE brand = NULL
Du får et tomt bord:
id | navn | mærke | pris | tælle |
---|
Men hvis du skriver i forespørgslen, at brand ikke er lig med NULL
, får du det samme resultat:
SELECT * FROM product
WHERE brand != NULL
Du får igen et tomt bord:
id | navn | mærke | pris | tælle |
---|
Enhver sammenligning/handling med NULL vil returnere NULL:
Udtryk | Resultat |
---|---|
mærke = NULL | NUL |
mærke != NULL | NUL |
NULL = NULL | NUL |
NULL != NULL | NUL |
Ja,selvom du sammenligner NULL med NULL, så vil svaret være NULL.
5.3 ER NULL og ER IKKE NULL
Så hvordan kontrollerer vi, at et felt (eller en kolonne) har en værdi på NULL
? Og til dette har SQL et særligt udtryk - IS NULL
. Det ser sådan ud.
variable IS NULL
Hvis du vil tjekke om en kolonne i din tabel ikke er lig med NULL
, så skal du skrive IS NOT NULL
:
variable IS NOT NULL
Lad os skrive en forespørgsel, der vil vælge alle produkter fra produkttabellen, hvis mærke er lig med NULL
. En sådan anmodning ville se sådan ud:
SELECT * FROM product
WHERE brand IS NULL
Og vi får følgende forespørgselsresultat:
id | navn | mærke | pris | tælle |
---|---|---|---|---|
14 | Skrue | NUL | 0,10 | 1000 |
15 | Nitte | NUL | 0,01 | 1000 |
Lad os nu vise alle de produkter, hvis pris er mindre end $20:
SELECT * FROM product
WHERE price < 20
Og vi får følgende forespørgselsresultat:
id | navn | mærke | pris | tælle |
---|---|---|---|---|
2 | Stol | IKEA | 5.00 | 45 |
8 | Lampe | LG | 15.00 | 100 |
14 | Skrue | NUL | 0,10 | 1000 |
15 | Nitte | NUL | 0,01 | 1000 |
Nu angiver vi, at prisen skal være mindre end $20, og mærket er ikke NULL
.
SELECT * FROM product
WHERE price < 20 AND brand IS NOT NULL
Vi får følgende forespørgselsresultat:
id | navn | mærke | pris | tælle |
---|---|---|---|---|
2 | Stol | IKEA | 5.00 | 45 |
8 | Lampe | LG | 15.00 | 100 |
Godt, de sidste to linjer er væk. Sådan fungerer det. Lidt usædvanligt, men alligevel er der en vis logik i dette.
GO TO FULL VERSION