Forberedelse til kodeinterviews · Lektion

Treværdilogik og UNKNOWN

Hvorfor NULL = NULL ikke er sandt, og hvordan UNKNOWN føres videre gennem betingelser

Lektion 1 af 413 trin

Treværdilogik og UNKNOWN er en gratis Forberedelse til kodeinterviews-lektion på CoddyKit. Dette er lektion 1 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i Forberedelse til kodeinterviews, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Forberedelse til kodeinterviews-kurset indeholder 4 lektioner i alt.

Hvorfor NULL forvirrer kandidater

NULL er den hyppigste årsag til forkerte svar i SQL-interviews. Fælden er at behandle det som en normal værdi, selv om NULL betyder "ukendt" eller "manglende" – ikke nul og ikke en tom streng.

Interviewere elsker dette, fordi syntaksen ser korrekt ud, mens resultatet er forkert uden nogen tydelig fejl. De kan vise dig et filter, der "burde" returnere en række, og spørge, hvorfor det ikke returnerer noget.

I denne lektion opbygger du den mentale model, der afklarer alle spørgsmål om NULL: treværdilogik. Når du først har forstået, at sammenligninger kan returnere SAND, FALSK eller UKENDT, følger resten naturligt.

NULL er ikke en værdi

Den vigtigste sætning at sige i et interview er: NULL er fraværet af en værdi, ikke en værdi i sig selv.

Det betyder, at du ikke kan sammenligne det med =, som du sammenligner tal. Databasen ved ikke, om to ukendte værdier er ens, så den nægter at fastslå, om resultatet er SANDT eller FALSKT.

  • NULL = 5 er ikke FALSKT, men UKENDT
  • NULL = NULL er ikke SANDT, men UKENDT
  • NULL <> NULL er også UKENDT

Derfor fjerner et naivt lighedsfilter på en kolonne, der kan indeholde NULL, stille og roligt rækker.

To-værdilogik kontra treværdilogik

De fleste programmeringssprog bruger to-værdilogik: Et udtryk er enten SANDT eller FALSKT. SQL tilføjer et tredje resultat, UKENDT, når en sammenligning involverer NULL.

Ethvert prædikat i SQL kan derfor evalueres til ét af tre resultater: SANDT, FALSKT eller UKENDT. WHERE-sætningen beholder kun en række, når prædikatet er præcis SANDT. UKENDT opfører sig som FALSKT ved filtrering, men er logisk set ikke det samme.

Interviewere tester, om du kender denne forskel, fordi UKENDT opfører sig anderledes under NOT end FALSKT gør.

Et filter, der stille og roligt fjerner rækker

Her er det klassiske gennemarbejdede eksempel. Antag, at bonus nogle gange er NULL. En rekrutterer spørger: "Denne forespørgsel burde returnere alle, hvis bonus ikke er 1000. Hvorfor springer den medarbejdere uden bonus over?"

For en række, hvor bonus er NULL, evalueres bonus <> 1000 til UKENDT, ikke SANDT. WHERE beholder kun SANDTE rækker, så de pågældende medarbejdere forsvinder.

Løsningen er at håndtere NULL eksplicit, hvilket vi gennemgår i næste lektion. Indtil videre skal du genkende, at de manglende rækker skyldes logikken og ikke en fejl.

SELECT name, bonus
FROM employees
WHERE bonus <> 1000;
-- Rows where bonus IS NULL are excluded:
-- NULL <> 1000 evaluates to UNKNOWN, not TRUE

NULL i AND-udtryk

Treværdilogik ændrer den måde, AND opfører sig på. Husk reglen, så kan du svare på ethvert spørgsmål om sandhedstabeller på stedet.

  • TRUE AND UNKNOWN = UKENDT
  • FALSE AND UNKNOWN = FALSKT
  • UNKNOWN AND UNKNOWN = UKENDT

Intuitionen er, at AND kun behøver én FALSK værdi for med sikkerhed at være FALSK. Derfor forbliver FALSE AND hvad som helst FALSE. Men TRUE AND en ukendt værdi er stadig ukendt, fordi den ukendte side kan vise sig at være hvad 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 returned

NULL i OR-udtryk

OR spejler AND. Det behøver kun én SAND værdi for med sikkerhed at være SANDT, så TRUE gør den ukendte værdi irrelevant.

  • TRUE OR UNKNOWN = SANDT
  • FALSE OR UNKNOWN = UKENDT
  • UNKNOWN OR UNKNOWN = UKENDT

En række kan altså stadig matche en OR-betingelse, selv om én gren er ukendt, så længe en anden gren reelt er SAND. Dette er et almindeligt opfølgende spørgsmål efter spørgsmålet 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 returned

NOT vender SANDT og FALSKT, men ikke UKENDT

Her er den subtile variant, som interviewere gemmer til sidst. NOT vender SANDT til FALSKT og FALSKT til SANDT, men NOT UKENDT er stadig UKENDT.

Derfor kan du ikke bare pakke en fejlslagen betingelse ind i NOT for at vende resultatet. Hvis bonus = 1000 er UKENDT for en række med NULL, er NOT (bonus = 1000) også UKENDT, og rækken bliver stadig udelukket.

Negation redder ikke rækker med NULL. Kun en eksplicit IS NULL-test 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);

Gennemarbejdet eksempel: Fælden med NOT IN

Dette er en af de mest stillede NULL-gåder. NOT IN med en liste, der indeholder NULL, returnerer ingen rækker overhovedet, hvilket overrasker kandidater, der forventer, at NULL blot bliver sprunget over.

Internt udvides x NOT IN (1, 2, NULL) til x <> 1 AND x <> 2 AND x <> NULL. Den sidste sammenligning er UKENDT, og TRUE AND TRUE AND UNKNOWN reduceres til UKENDT, så intet opfylder betingelsen.

Det sikre alternativ er NOT EXISTS, som ikke er sårbart over for dette.

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

Hvorfor UKENDT opfører sig som FALSKT i WHERE

Et almindeligt opfølgende spørgsmål er: "Hvis UKENDT ikke er FALSKT, hvorfor bliver rækken så fjernet ligesom en FALSK række?"

Svaret er præcist: WHERE, ON og HAVING bruger alle reglen behold kun SANDT. Både FALSKT og UKENDT består ikke denne test, så de ser ens ud ved filtrering.

Forskellen viser sig kun ved negation og CHECK-begrænsninger. En CHECK-begrænsning accepterer en række, når betingelsen er SANDT eller UKENDT, så NULL kan slippe forbi en CHECK-begrænsning, som du regnede med ville blokere 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 -> allowed

Fordybende eksempel: COUNT og forskellen i sandhedsværdier

Lad os samle det med en realistisk interviewopgave. "Vi har 100 medarbejdere. SELECT COUNT(*) WHERE bonus = 100 returnerer 30, og WHERE bonus <> 100 returnerer 50. Hvor er de øvrige 20?"

De manglende 20 har en NULL-bonus. Hverken = 100 eller <> 100 er SANDT for dem; begge er UKENDT, så de falder helt igennem begge filtre.

At sige "grupperne giver ikke tilsammen det samlede antal, fordi NULL ikke opfylder nogen af prædikaterne" er præcis det svar, interviewere ønsker.

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;

Vigtige pointer til interviewet

Når NULL-logik kommer op, skal du fremhæve disse punkter for at virke erfaren:

  • NULL betyder ukendt; sammenligninger med det giver UKENDT.
  • SQL bruger treværdilogik: SANDT, FALSKT, UKENDT.
  • WHERE, ON og HAVING beholder kun SANDTE rækker.
  • NOT UNKNOWN er stadig UKENDT, så negation gendanner ikke rækker med NULL.
  • NOT IN med en hvilken som helst NULL returnerer ingen rækker; foretræk NOT EXISTS.

Præsentér modellen først, og gennemgå derefter sandhedstabellen. Den rækkefølge viser, at du forstår hvorfor og ikke kun selve tricket.

Hurtig test

Test, hvor godt du forstår treværdilogik.

Opsummering

Du har nu den grundlæggende mentale model for NULL:

  • NULL er ukendt, ikke en værdi; sammenlign det aldrig med = eller <>.
  • SQL har tre værdier: prædikater returnerer SANDT, FALSKT eller UKENDT.
  • Filtreringssætninger beholder kun SANDT; rækker med UKENDT forsvinder ligesom rækker med FALSKT.
  • NOT vender SANDT og FALSKT, men lader UKENDT være uændret.
  • Fælden med NOT IN + NULL returnerer nul rækker; brug i stedet NOT EXISTS.

Næste emne er den korrekte måde at teste for NULL på med IS NULL, IS NOT NULL og NULL-sikre lighedsoperatorer.

Gratis at komme i gang

Lær Forberedelse til kodeinterviews med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
90
Lektioner
360

Ofte stillede spørgsmål

Er lektionen “Treværdilogik og UNKNOWN” gratis?

Ja — hele teksten til “Treværdilogik og UNKNOWN” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af Forberedelse til kodeinterviews-kurset, skal du opgradere til CoddyKit PRO. Forberedelse til kodeinterviews-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Treværdilogik og UNKNOWN”?

Hvorfor NULL = NULL ikke er sandt, og hvordan UNKNOWN føres videre gennem betingelser Du øver dig i Forberedelse til kodeinterviews med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på Forberedelse til kodeinterviews?

Der kræves ingen tidligere erfaring. Forberedelse til kodeinterviews på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 1 af 4.

Hvor lang tid tager lektionen “Treværdilogik og UNKNOWN”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne Forberedelse til kodeinterviews-lektion?

Ja. Alle Forberedelse til kodeinterviews-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Treværdilogik og UNKNOWN
  2. IS NULL, IS NOT NULL og NULL-sikker lighed
  3. COALESCE, NULLIF og ISNULL
  4. NULL'er i aggregater, joins og DISTINCT
← Tilbage til Forberedelse til kodeinterviews