5.1 Bristande betydelse
SQL-språket, liksom Java-språket, har ett speciellt nyckelord för att beteckna frånvaron av ett värde - det är null. Eller som det ofta skrivs - NULL
.
Användningen NULL
i SQL är mycket lik användningen av null i Java. I Java kan det finnas objekt vars fält innehåller nollvärden. I SQL kan det finnas tabeller vars rader innehåller NULL-värden.
Låt mig lägga till ett par omärkta produkter till vår produkttabell med flit. Om produktens märke är okänt blir värdet NULL
.
För att visa sådana produkter, låt oss sortera vår produkttabell efter id i omvänd ordning och ta 10 poster. Förfrågan kommer att se ut så här:
SELECT * FROM product
ORDER BY id DESC
LIMIT 10
Vi får följande frågeresultat:
id | namn | varumärke | pris | räkna |
---|---|---|---|---|
15 | Nit | NULL | 0,01 | 1000 |
14 | Skruva | NULL | 0,10 | 1000 |
13 | Stå | IKEA | 100,00 | 10 |
12 | blomkruka | Smartflower | 99,00 | 9 |
elva | Fåtölj | Bosch | 44.00 | 8 |
10 | Tallrik | Bosch | 199.00 | 10 |
9 | Byrå | IKEA | 99,00 | 10 |
8 | Lampa | LG | 15.00 | 100 |
7 | TV | LG | 350,00 | 4 |
6 | Hylla | Bosch | 25.00 | 114 |
Ja, jag la till nitar och skruvar på bordet. De har pris och kvantitet, men inget märke.
5.2 Jämförelse med NULL
Kommer du ihåg att du ibland brukade bli arg i Java när du använde null? Att du inte kan jämföra variabler som kan referera till nollvärden via equals(). Exempel:
Product product1 = new Product();
Product product2 = null;
if (product2.equals(product1) { //an exception will be raised here
…
}
Du kommer inte att tro det, men i SQL-språket väntar du också på nyanserna när du arbetar med NULL-värden. Och det låter ungefär så här:ingenting är NULL.
Om du försöker filtrera bort alla produkter vars varumärke är null
:
SELECT * FROM product
WHERE brand = NULL
Du får ett tomt bord:
id | namn | varumärke | pris | räkna |
---|
Men om du skriver i frågan att varumärke inte är lika med NULL
, får du samma resultat:
SELECT * FROM product
WHERE brand != NULL
Du får återigen ett tomt bord:
id | namn | varumärke | pris | räkna |
---|
Varje jämförelse/åtgärd med NULL kommer att returnera NULL:
Uttryck | Resultat |
---|---|
varumärke = NULL | NULL |
varumärke != NULL | NULL |
NULL = NULL | NULL |
NULL != NULL | NULL |
Ja,även om du jämför NULL med NULL, så blir svaret NULL.
5.3 ÄR NULL och ÄR INTE NULL
Så hur kontrollerar vi att något fält (eller någon kolumn) har värdet NULL
? Och för detta har SQL ett speciellt uttryck - IS NULL
. Det ser ut så här.
variable IS NULL
Om du vill kontrollera om en kolumn i din tabell inte är lika med , NULL
måste du skriva IS NOT NULL
:
variable IS NOT NULL
Låt oss skriva en fråga som väljer alla produkter från produkttabellen vars varumärke är lika med NULL
. En sådan begäran skulle se ut så här:
SELECT * FROM product
WHERE brand IS NULL
Och vi får följande frågeresultat:
id | namn | varumärke | pris | räkna |
---|---|---|---|---|
14 | Skruva | NULL | 0,10 | 1000 |
15 | Nit | NULL | 0,01 | 1000 |
Låt oss nu visa alla produkter vars pris är mindre än 20 USD:
SELECT * FROM product
WHERE price < 20
Och vi får följande frågeresultat:
id | namn | varumärke | pris | räkna |
---|---|---|---|---|
2 | Stol | IKEA | 5.00 | 45 |
8 | Lampa | LG | 15.00 | 100 |
14 | Skruva | NULL | 0,10 | 1000 |
15 | Nit | NULL | 0,01 | 1000 |
Nu anger vi att priset måste vara mindre än 20 USD och att varumärket inte är NULL
.
SELECT * FROM product
WHERE price < 20 AND brand IS NOT NULL
Vi får följande frågeresultat:
id | namn | varumärke | pris | räkna |
---|---|---|---|---|
2 | Stol | IKEA | 5.00 | 45 |
8 | Lampa | LG | 15.00 | 100 |
Bra, de två sista raderna är borta. Så här fungerar det. Lite ovanligt, men ändå finns det en viss logik i detta.