5.1 Gebrek aan betekenis
De SQL-taal heeft, net als de Java-taal, een speciaal trefwoord om de afwezigheid van een waarde aan te geven - het is null. Of zoals het vaak wordt geschreven - NULL
.
Het gebruik NULL
in SQL lijkt sterk op het gebruik van null in Java. In Java kunnen er objecten zijn waarvan de velden null-waarden bevatten. In SQL kunnen er tabellen zijn waarvan de rijen NULL-waarden bevatten.
Ik voeg met opzet een paar merkloze producten toe aan onze producttabel. Als het merk van het product onbekend is, is de waarde NULL
.
Om dergelijke producten weer te geven, sorteren we onze producttabel op id in omgekeerde volgorde en nemen we 10 records. Het verzoek ziet er als volgt uit:
SELECT * FROM product
ORDER BY id DESC
LIMIT 10
We krijgen het volgende zoekresultaat:
ID kaart | naam | merk | prijs | graaf |
---|---|---|---|---|
15 | Klinknagel | NUL | 0.01 | 1000 |
14 | Schroef | NUL | 0,10 | 1000 |
13 | Stellage | Ikea | 100.00 | 10 |
12 | bloempot | Slimme bloem | 99.00 | 9 |
elf | Fauteuil | Bosch | 44.00 uur | 8 |
10 | Bord | Bosch | 199.00 | 10 |
9 | Dressoir | Ikea | 99.00 | 10 |
8 | Lamp | LG | 15.00 uur | 100 |
7 | TV | LG | 350.00 | 4 |
6 | Plank | Bosch | 25.00 uur | 114 |
Ja, ik heb klinknagels en schroeven aan de tafel toegevoegd. Ze hebben prijs en hoeveelheid, maar geen merk.
5.2 Vergelijking met NULL
Weet je nog dat je soms boos werd in Java als je null gebruikte? Dat je via equals() geen variabelen kunt vergelijken die naar null-waarden kunnen verwijzen. Voorbeeld:
Product product1 = new Product();
Product product2 = null;
if (product2.equals(product1) { //an exception will be raised here
…
}
Je gelooft het niet, maar ook in de SQL-taal zit je te wachten op de nuances bij het werken met NULL-waarden. En het klinkt ongeveer zo:niets is NULL.
Als u alle producten probeert uit te filteren waarvan het merk is null
:
SELECT * FROM product
WHERE brand = NULL
Je krijgt een lege tabel:
ID kaart | naam | merk | prijs | graaf |
---|
Maar als u in de zoekopdracht schrijft dat merk niet gelijk is aan NULL
, krijgt u hetzelfde resultaat:
SELECT * FROM product
WHERE brand != NULL
Je krijgt weer een lege tafel:
ID kaart | naam | merk | prijs | graaf |
---|
Elke vergelijking/actie met NULL levert NULL op:
Uitdrukking | Resultaat |
---|---|
merk = NULL | NUL |
merk != NULL | NUL |
NUL = NUL | NUL |
NUL != NUL | NUL |
Ja,zelfs als je NULL met NULL vergelijkt, dan is het antwoord NULL.
5.3 IS NULL en IS NIET NULL
Dus hoe controleren we of een veld (of een kolom) een waarde heeft van NULL
? En hiervoor heeft SQL een speciale uitdrukking - IS NULL
. Het ziet er zo uit.
variable IS NULL
Als je wilt controleren of een kolom van je tabel niet gelijk is aan NULL
, dan moet je schrijven IS NOT NULL
:
variable IS NOT NULL
Laten we een query schrijven die alle producten uit de producttabel selecteert waarvan het merk gelijk is aan NULL
. Zo'n verzoek ziet er als volgt uit:
SELECT * FROM product
WHERE brand IS NULL
En we krijgen het volgende zoekresultaat:
ID kaart | naam | merk | prijs | graaf |
---|---|---|---|---|
14 | Schroef | NUL | 0,10 | 1000 |
15 | Klinknagel | NUL | 0.01 | 1000 |
Laten we nu alle producten weergeven waarvan de prijs minder dan $ 20 is:
SELECT * FROM product
WHERE price < 20
En we krijgen het volgende zoekresultaat:
ID kaart | naam | merk | prijs | graaf |
---|---|---|---|---|
2 | Stoel | Ikea | 5.00 | 45 |
8 | Lamp | LG | 15.00 uur | 100 |
14 | Schroef | NUL | 0,10 | 1000 |
15 | Klinknagel | NUL | 0.01 | 1000 |
Nu specificeren we dat de prijs minder dan $ 20 moet zijn en het merk niet NULL
.
SELECT * FROM product
WHERE price < 20 AND brand IS NOT NULL
We krijgen het volgende zoekresultaat:
ID kaart | naam | merk | prijs | graaf |
---|---|---|---|---|
2 | Stoel | Ikea | 5.00 | 45 |
8 | Lamp | LG | 15.00 uur | 100 |
Geweldig, de laatste twee regels zijn weg. Dit is hoe het werkt. Een beetje ongewoon, maar toch zit er een zekere logica in.