Tre värden i logiken och UNKNOWN
Varför NULL = NULL inte är sant och hur UNKNOWN sprids genom villkor
Tre värden i logiken och UNKNOWN är en gratis lektion i Förberedelse inför kodningsintervjuer på CoddyKit. Detta är lektion 1 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för Förberedelse inför kodningsintervjuer, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Förberedelse inför kodningsintervjuer innehåller totalt 4 lektioner.
Varför NULL ställer till det för kandidater
NULL är den främsta källan till felaktiga svar i SQL-intervjuer. Fällan är att behandla det som ett vanligt värde, när NULL i själva verket betyder ”okänt” eller ”saknas”, inte noll och inte en tom sträng.
Intervjuare uppskattar detta exempel eftersom syntaxen ser korrekt ut, men resultatet blir fel utan att något felmeddelande visas. De kan visa ett filter som ”borde” returnera en rad och fråga varför det inte returnerar något.
I den här lektionen bygger du den mentala modell som löser alla NULL-frågor: trevärdeslogik. När du väl har förstått att jämförelser kan returnera TRUE, FALSE eller UNKNOWN följer resten naturligt.
NULL är inte ett värde
Den viktigaste enskilda meningen att säga under en intervju är: NULL är frånvaron av ett värde, inte ett värde i sig.
Det innebär att du inte kan jämföra det med = på samma sätt som du jämför tal. Databasen vet inte om två okända värden är lika, så den kan inte ange TRUE eller FALSE.
NULL = 5är inte FALSE, utan UNKNOWNNULL = NULLär inte TRUE, utan UNKNOWNNULL <> NULLär också UNKNOWN
Det är därför ett naivt likhetsfilter på en kolumn som tillåter NULL i det tysta tar bort rader.
Tvåvärdeslogik kontra trevärdeslogik
De flesta programspråk använder tvåvärdeslogik: ett uttryck är antingen TRUE eller FALSE. SQL lägger till ett tredje utfall, UNKNOWN, när NULL ingår i en jämförelse.
Alla predikat i SQL kan alltså utvärderas till ett av tre resultat: TRUE, FALSE eller UNKNOWN. WHERE-satsen behåller en rad endast när predikatet är exakt TRUE. UNKNOWN fungerar som FALSE vid filtrering, men är logiskt inte samma sak.
Intervjuare testar om du känner till denna skillnad, eftersom UNKNOWN beter sig annorlunda under NOT än FALSE gör.
Ett filter som i det tysta tar bort rader
Här är det klassiska genomarbetade exemplet. Anta att bonus ibland är NULL. En rekryterare frågar: ”Den här frågan borde returnera alla vars bonus inte är 1000. Varför hoppar den över anställda utan bonus?”
För en rad där bonus är NULL utvärderas bonus <> 1000 till UNKNOWN, inte TRUE. WHERE behåller endast rader med TRUE, så dessa anställda försvinner.
Lösningen är att hantera NULL uttryckligen, vilket vi går igenom i nästa lektion. Just nu räcker det att förstå att de saknade raderna beror på logiken och inte på ett fel.
SELECT name, bonus
FROM employees
WHERE bonus <> 1000;
-- Rows where bonus IS NULL are excluded:
-- NULL <> 1000 evaluates to UNKNOWN, not TRUENULL i AND-uttryck
Trevärdeslogik förändrar hur AND fungerar. Lär dig regeln utantill, så kan du svara på alla frågor om sanningstabeller direkt.
- TRUE AND UNKNOWN = UNKNOWN
- FALSE AND UNKNOWN = FALSE
- UNKNOWN AND UNKNOWN = UNKNOWN
Intuitionen är att AND bara behöver ett FALSE för att resultatet definitivt ska bli FALSE. Därför förblir FALSE AND vad som helst FALSE. Men TRUE AND UNKNOWN är fortfarande UNKNOWN, eftersom den okända sidan kan visa sig bli vilket resultat som helst.
-- If status = 'active' is TRUE but bonus = 100 is UNKNOWN:
SELECT *
FROM employees
WHERE status = 'active' AND bonus = 100;
-- Combined result is UNKNOWN, so the row is NOT returnedNULL i OR-uttryck
OR följer motsvarande princip som AND. Det behövs bara ett TRUE för att resultatet definitivt ska bli TRUE, så ett TRUE gör att det okända inte spelar någon roll.
- TRUE OR UNKNOWN = TRUE
- FALSE OR UNKNOWN = UNKNOWN
- UNKNOWN OR UNKNOWN = UNKNOWN
En rad kan alltså fortfarande matcha ett OR-villkor även när en gren är okänd, så länge en annan gren verkligen är TRUE. Detta är en vanlig följdfråga efter frågan om AND.
SELECT *
FROM employees
WHERE department = 'Sales' OR bonus = 100;
-- A Sales employee with NULL bonus:
-- TRUE OR UNKNOWN = TRUE, so the row IS returnedNOT växlar TRUE och FALSE, men inte UNKNOWN
Här kommer den subtila variant som intervjuare brukar spara till sist. NOT vänder TRUE till FALSE och FALSE till TRUE, men NOT UNKNOWN är fortfarande UNKNOWN.
Det är därför du inte bara kan omsluta ett villkor som misslyckas med NOT för att vända resultatet. Om bonus = 1000 är UNKNOWN för en NULL-rad, är även NOT (bonus = 1000) UNKNOWN, och raden utesluts fortfarande.
Negation räddar inte NULL-rader. Endast ett uttryckligt test med IS NULL gör det.
-- For a row where bonus IS NULL:
-- bonus = 1000 -> UNKNOWN
-- NOT (bonus = 1000) -> UNKNOWN (still excluded)
SELECT * FROM employees WHERE NOT (bonus = 1000);Genomarbetat exempel: fällan med NOT IN
Det här är en av de vanligaste NULL-frågorna i intervjuer. NOT IN med en lista som innehåller NULL returnerar inte en enda rad, vilket överraskar kandidater som förväntar sig att NULL bara ska hoppas över.
Internt utvecklas x NOT IN (1, 2, NULL) till x <> 1 AND x <> 2 AND x <> NULL. Den sista jämförelsen är UNKNOWN, och TRUE AND TRUE AND UNKNOWN blir UNKNOWN, så ingenting uppfyller villkoret.
Det säkra alternativet är NOT EXISTS, som inte påverkas av detta.
-- Returns ZERO rows if the subquery yields any NULL
SELECT name
FROM employees
WHERE manager_id NOT IN (SELECT manager_id FROM managers);
-- Each comparison against NULL becomes UNKNOWN,
-- and the AND-chain collapses to UNKNOWN for every row.Varför UNKNOWN fungerar som FALSE i WHERE
En vanlig följdfråga är: ”Om UNKNOWN inte är FALSE, varför tas raden bort på samma sätt som en rad med FALSE?”
Det exakta svaret är att WHERE, ON och HAVING följer regeln behåll endast TRUE. Både FALSE och UNKNOWN klarar inte det testet, så de ser likadana ut vid filtrering.
Skillnaden märks först vid negation och CHECK-begränsningar. En CHECK-begränsning godkänner en rad när villkoret är TRUE eller UNKNOWN, så en NULL kan slinka igenom en CHECK-begränsning som du trodde skulle stoppa den.
-- CHECK passes on TRUE or UNKNOWN, so NULL salary is allowed:
-- CONSTRAINT salary_positive CHECK (salary > 0)
-- INSERT ... salary = NULL -> NULL > 0 is UNKNOWN -> allowedDjupare exempel: COUNT och luckan som NULL skapar
Knyt ihop allt med en realistisk intervjufråga. ”Vi har 100 anställda. SELECT COUNT(*) WHERE bonus = 100 returnerar 30, och WHERE bonus <> 100 returnerar 50. Var finns de övriga 20?”
De saknade 20 har NULL som bonus. Varken = 100 eller <> 100 är TRUE för dem; båda blir UNKNOWN, så de faller igenom båda filtren.
Att säga ”grupperna summerar inte till totalen eftersom NULL inte uppfyller något av predikaten” är exakt det svar intervjuare vill höra.
SELECT
COUNT(*) FILTER (WHERE bonus = 100) AS eq_100,
COUNT(*) FILTER (WHERE bonus <> 100) AS ne_100,
COUNT(*) FILTER (WHERE bonus IS NULL) AS null_bonus,
COUNT(*) AS total
FROM employees;Viktiga punkter inför intervjun
När NULL-logik kommer upp bör du ta upp följande för att visa senior kompetens:
- NULL betyder okänt; jämförelser med det ger UNKNOWN.
- SQL använder trevärdeslogik: TRUE, FALSE, UNKNOWN.
- WHERE, ON och HAVING behåller endast TRUE-rader.
NOT UNKNOWNär fortfarande UNKNOWN, så negation återställer inte NULL-rader.NOT INmed valfri NULL returnerar inga rader; föredraNOT EXISTS.
Presentera modellen först och gå sedan igenom sanningstabellen. Den ordningen visar att du förstår varför, inte bara själva tricket.
Snabbkontroll
Testa dina kunskaper om trevärdeslogik.
Sammanfattning
Du har nu den grundläggande mentala modellen för NULL:
- NULL är okänt, inte ett värde; jämför det aldrig med
=eller<>. - SQL använder tre värden: predikat returnerar TRUE, FALSE eller UNKNOWN.
- Filtreringssatser behåller endast TRUE; rader med UNKNOWN försvinner precis som rader med FALSE.
NOTväxlar TRUE och FALSE, men lämnar UNKNOWN oförändrat.- Fällan med
NOT IN+ NULL returnerar noll rader; använd i ställetNOT EXISTS.
Nästa steg: rätt sätt att testa NULL med IS NULL, IS NOT NULL och NULL-säkra likhetsoperatorer.
Lär dig Förberedelse inför kodningsintervjuer med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 90
- Lektioner
- 360
Vanliga frågor
Är lektionen ”Tre värden i logiken och UNKNOWN” gratis?
Ja – hela texten till ”Tre värden i logiken och UNKNOWN” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i Förberedelse inför kodningsintervjuer, kan Ni uppgradera till CoddyKit PRO. Kursen i Förberedelse inför kodningsintervjuer innehåller totalt 4 lektioner.
Vad lär jag mig i ”Tre värden i logiken och UNKNOWN”?
Varför NULL = NULL inte är sant och hur UNKNOWN sprids genom villkor Ni övar på Förberedelse inför kodningsintervjuer med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig Förberedelse inför kodningsintervjuer?
Du behöver inga förkunskaper. Utbildningen i Förberedelse inför kodningsintervjuer på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 1 av 4.
Hur lång tid tar lektionen ”Tre värden i logiken och UNKNOWN”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här Förberedelse inför kodningsintervjuer-lektionen?
Ja. Varje Förberedelse inför kodningsintervjuer-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.
Alla lektioner i den här kursen
- Tre värden i logiken och UNKNOWN
- IS NULL, IS NOT NULL och NULL-säker likhet
- COALESCE, NULLIF och ISNULL
- NULL i aggregeringar, joinar och DISTINCT