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 NULLin 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.