Du kjører en spørring for å finne kunder uten postnummer: WHERE postal_code = NULL. Resultatet er tomt, selv om du vet at flere kunder mangler postnummer. Spørringen ser riktig ut, men NULL fungerer ikke som vanlige verdier i SQL.
NULL betyr «ukjent» eller «mangler». Det er ikke det samme som 0, en tom streng eller ordet «null». Det er fravær av en verdi. Og fordi verdien er ukjent, kan SQL ikke sammenligne den med noe, heller ikke med en annen NULL.
Hvorfor = ikke fungerer med NULL
Vanlige sammenligningsoperatorer som =, >, < og != gir alltid et ukjent resultat når NULL er involvert. SQL opererer med tre mulige utfall av en sammenligning: sant, usant og ukjent. Når resultatet er ukjent, behandles raden som om betingelsen er usann.
Det betyr at alle disse gir tomt resultat hvis postal_code er NULL:
- WHERE postal_code = NULL (ukjent)
- WHERE postal_code != NULL (ukjent)
- WHERE postal_code > NULL (ukjent)
Selv NULL = NULL gir ukjent. To ukjente verdier er ikke nødvendigvis like. Tenk på det som to lukkede konvolutter. Du vet ikke hva som er i dem, og du kan ikke si om innholdet er likt.
IS NULL: finn manglende verdier
For å finne rader med NULL bruker du IS NULL:
SELECT * FROM customers WHERE postal_code IS NULL;
Denne returnerer alle kunder der postnummeret mangler. IS NULL er den eneste måten å teste for NULL i WHERE-setningen. Det er ikke en sammenligningsoperator, men en spesiell test som sjekker om verdien er fraværende.
IS NOT NULL: finn rader med verdier
Det motsatte er IS NOT NULL, som finner rader der kolonnen har en verdi:
SELECT * FROM customers WHERE company IS NOT NULL;
Denne gir deg alle kunder som har en bedrift registrert. Kunder der company-feltet mangler (er NULL) filtreres bort.
IS NOT NULL er nyttig for datakvalitet. Du kan raskt finne ut hvilke rader som har komplette data i en bestemt kolonne.
NULL i aggregatfunksjoner
Aggregatfunksjoner håndterer NULL ulikt:
- COUNT(*) teller alle rader, inkludert de med NULL-verdier
- COUNT(kolonne) teller bare rader der kolonnen har en verdi (ignorerer NULL)
- SUM, AVG, MAX, MIN ignorerer NULL-verdier i beregningen
Forskjellen mellom COUNT(*) og COUNT(kolonne) er viktig:
SELECT COUNT(*), COUNT(postal_code) FROM customers;
Hvis tabellen har 59 kunder og 4 av dem mangler postnummer, gir COUNT(*) 59 og COUNT(postal_code) 55. Denne forskjellen kan du bruke til å finne ut hvor mange NULL-verdier som finnes i en kolonne.
For AVG kan NULL-verdier påvirke resultatet på en måte du kanskje ikke forventer. Hvis tre rader har verdiene 10, 20 og NULL, beregner AVG gjennomsnittet av 10 og 20 (altså 15), ikke av 10, 20 og 0 (som ville vært 10). NULL-raden ignoreres helt.
NULL i GROUP BY
Når du bruker GROUP BY på en kolonne som inneholder NULL, samles alle NULL-radene i én egen gruppe. Det kan faktisk være nyttig for å analysere manglende data:
SELECT postal_code, COUNT(*) FROM customers GROUP BY postal_code;
Resultatet inkluderer en rad der postal_code er NULL, med antall kunder som mangler postnummer.
NULL i sortering
Når du bruker ORDER BY på en kolonne med NULL-verdier, må databasen bestemme hvor de skal plasseres. I SQLite kommer NULL-verdier først ved stigende sortering (ASC) og sist ved synkende sortering (DESC). Andre databaser kan gjøre det annerledes.
Kombinere IS NULL med andre betingelser
IS NULL og IS NOT NULL kan kombineres med AND og OR som andre betingelser:
SELECT * FROM customers WHERE postal_code IS NULL AND country = 'Brazil';
Denne finner brasilianske kunder som mangler postnummer. Du kan også bruke IS NULL sammen med LIKE, IN og andre operatorer:
SELECT * FROM customers WHERE company IS NOT NULL AND country IN ('Norway', 'Sweden');
COALESCE: erstatt NULL med en verdi
Noen ganger vil du vise en standardverdi i stedet for NULL. COALESCE returnerer den første ikke-NULL-verdien fra en liste med argumenter:
SELECT first_name, COALESCE(company, 'Privatkunde') AS selskap FROM customers;
Kunder med en bedrift får bedriftsnavnet vist. Kunder uten (der company er NULL) får teksten «Privatkunde» i stedet. COALESCE er nyttig for å gjøre resultater mer lesbare og for å unngå NULL i videre beregninger.
Unngå NULL-feller
Den vanligste feilen med NULL er å glemme at den oppfører seg annerledes enn andre verdier. Her er noen situasjoner der NULL kan overraske deg:
- NOT IN med NULL. WHERE x NOT IN (1, 2, NULL) gir alltid null rader, fordi sammenligningen med NULL gir ukjent. Unngå NULL i IN-lister.
- Beregninger med NULL. 5 + NULL = NULL. Ethvert regnestykke med NULL gir NULL som resultat.
- Strenger med NULL. 'hei' || NULL = NULL i de fleste databaser. Sammenslåing med NULL gir NULL.
Vanlige feil med NULL
- Bruke = NULL eller != NULL. Bruk alltid IS NULL eller IS NOT NULL.
- Anta at COUNT(*) og COUNT(kolonne) gir det samme. COUNT(*) teller alle rader, COUNT(kolonne) teller bare ikke-NULL-verdier.
- Glemme at NULL påvirker beregninger. SUM og AVG ignorerer NULL, men en NULL i et regnestykke (som pris * antall) gir NULL.
Neste steg
NULL-verdier dukker opp overalt i databaser, og forståelsen av hvordan de oppfører seg er viktig for å skrive korrekte spørringer. Nå som du forstår filtrering, aggregering og NULL, er du klar for å lære JOIN for å koble sammen data fra flere tabeller.
Denne videoen er hentet fra kurset SQL for nybegynnere på Utdannet.no. I kurset lærer du SQL fra grunnen av med praktiske øvelser og en ekte database.



