Forberedelse til kodeintervjuer · leksjon

Finne rader uten samsvar (anti-join)

Mønsteret LEFT JOIN / IS NULL for å finne foreldreløse og manglende data.

Leksjon 3 av 413 trinn

Finne rader uten samsvar (anti-join) er en gratis leksjon i Forberedelse til kodeintervjuer på CoddyKit. Dette er leksjon 3 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Forberedelse til kodeintervjuer, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Forberedelse til kodeintervjuer inneholder totalt 4 leksjoner.

Spørsmålet om anti-join

Et av de vanligste spørsmålene om outer join er: «Finn kunder som aldri har lagt inn en ordre.» Eller: «List opp produkter som aldri er solgt» eller «ordrer uten en matchende kunde».

Alle disse har samme form: rader i én tabell som ikke har noe treff i en annen. Det ryddige mønsteret er en anti-join, bygget med en LEFT JOIN og et IS NULL-filter.

Grunntanken

Start med en LEFT JOIN: Den beholder hver rad til venstre, og rader uten treff på venstresiden får NULL i kolonnene fra høyre tabell.

Dermed er radene uten treff nøyaktig de radene der en kolonne fra høyre tabell er NULL. Filtrer på dette, så isolerer De radene uten treff. Det er hele trikset.

Bygge mønsteret

Her er den kanoniske anti-join-spørringen for å finne kunder uten ordrer. Les den i to trinn: LEFT JOIN beholder alle kunder, og deretter beholder WHERE o.customer_id IS NULL bare radene uten treff.

SELECT c.id, c.name
FROM customers c
LEFT JOIN orders o
  ON o.customer_id = c.id
WHERE o.customer_id IS NULL;
-- only customers with zero orders

Hvorfor dette fungerer, trinn for trinn

Følg det gjennom med dataene våre, der Carol ikke har noen ordrer:

  • LEFT JOIN produserer Alice (x2), Bob (x1) og Carol med NULL i kolonnene fra høyre tabell.
  • WHERE o.customer_id IS NULL forkaster Alice og Bob (kolonnene fra høyre tabell har reelle verdier for dem).
  • Bare raden til Carol, den som ble opprettet med NULL-verdier, overlever.

Filteret kjøres etter joinen, så det ser disse NULL-verdiene og velger nettopp radene uten tilhørende rad.

Velg riktig kolonne å teste

Test en kolonne fra høyre tabell som aldri legitimt kan være NULL ved et reelt treff, helst join-nøkkelen eller primærnøkkelen.

Hvis De tester en nullable kolonne fra høyre tabell, for eksempel o.shipped_at, vil De også fange opp ordrer som finnes, men ikke er sendt, og da blir svaret feil. Ved å teste o.customer_id (join-nøkkelen) eller o.id (primærnøkkelen) er De sikret at NULL betyr «ingen rad fikk treff».

-- SAFE: join key / primary key
WHERE o.id IS NULL

-- RISKY: a nullable data column
WHERE o.shipped_at IS NULL  -- catches unshipped too!

Anti-join kontra NOT IN

Intervjuere sammenligner anti-join med NOT IN. De ser likeverdige ut, men oppfører seg forskjellig når det finnes NULL-verdier.

Hvis underspørringen returnerer én eneste NULL-verdi, returnerer NOT IN ingen rader i det hele tatt – en beryktet, stille feil. Anti-join med LEFT JOIN / IS NULL påvirkes ikke av dette.

-- DANGEROUS if any customer_id is NULL
SELECT id, name FROM customers
WHERE id NOT IN (SELECT customer_id FROM orders);

-- SAFE anti-join, same intent
SELECT c.id, c.name FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
WHERE o.id IS NULL;

Anti-join kontra NOT EXISTS

Det andre likeverdige alternativet er NOT EXISTS med en korrelert underspørring. Den håndterer også NULL-verdier riktig og er ofte like rask.

Alle tre (LEFT JOIN/IS NULL, NOT EXISTS, NOT IN) kan uttrykke anti-joiner, men i et intervju bør De foretrekke LEFT JOIN/IS NULL eller NOT EXISTS fordi de er sikre ved NULL-verdier. Hvis De nevner NOT IN-fellen, gir det uttelling.

SELECT c.id, c.name
FROM customers c
WHERE NOT EXISTS (
  SELECT 1 FROM orders o
  WHERE o.customer_id = c.id
);

En vanlig feil

En vanlig feil er å plassere betingelsen for manglende treff i ON-delen i stedet for i WHERE.

Hvis De skriver ... ON o.customer_id = c.id AND o.id IS NULL, filtrerer De ikke resultatet. De endrer bare hva som regnes som et treff, og alle kunder overlever fortsatt LEFT JOIN. IS NULL-testen må stå i WHERE og brukes etter joinen. Denne fellen gjennomgår vi grundig i neste leksjon.

Finne foreldreløse underordnede rader

Mønsteret fungerer også i motsatt retning. For å finne ordrer som refererer til en manglende kunde (foreldreløse rader, en kontroll av dataintegritet), bevarer De orders og tester kundesiden for NULL.

SELECT o.id AS order_id, o.customer_id
FROM orders o
LEFT JOIN customers c
  ON c.id = o.customer_id
WHERE c.id IS NULL;
-- orders pointing to a non-existent customer

Telle de foreldreløse radene

Ofte er det eneste som etterspørres, et antall: «Hvor mange kunder har aldri lagt inn en ordre?» Pakk inn anti-joinen, eller tell direkte.

Fordi anti-joinen allerede returnerer én rad per foreldreløs rad, er en vanlig COUNT(*) på den riktig her – det finnes nøyaktig én rad per kunde uten treff.

SELECT COUNT(*) AS never_ordered
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
WHERE o.id IS NULL;

Den gjenbrukbare malen

Memoriser denne trelinjers grunnstrukturen; den løser en stor gruppe intervjuspørsmål:

  • FROM keep_table k
  • LEFT JOIN other o ON o.fk = k.id
  • WHERE o.id IS NULL

Bytt ut tabeller og nøkler for å finne usolgte produkter, ikke-tildelte saker, brukere uten innlogginger – alt som beskrives som «X uten en matchende Y».

Hurtigsjekk

De trenger produkter som aldri har forekommet i order_items.

Oppsummering

Anti-join finner rader uten treff: LEFT JOIN etterfulgt av WHERE right_key IS NULL.

  • Test join-nøkkelen eller primærnøkkelen, aldri en nullable datakolonne.
  • IS NULL-testen hører hjemme i WHERE, ikke i ON.
  • Den er likeverdig med NOT EXISTS; foretrekk den fremfor NOT IN, som feiler ved NULL-verdier.
  • Bytt om på tabellene for å finne foreldreløse underordnede rader.

Én mal, mange spørsmål: «X uten en matchende Y».

Gratis å komme i gang

Lær deg Forberedelse til kodeintervjuer med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
90
Leksjoner
360

Ofte stilte spørsmål

Er leksjonen «Finne rader uten samsvar (anti-join)» gratis?

Ja – hele teksten i «Finne rader uten samsvar (anti-join)» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av Forberedelse til kodeintervjuer-kurset, kan du oppgradere til CoddyKit PRO. Kurset i Forberedelse til kodeintervjuer inneholder totalt 4 leksjoner.

Hva lærer jeg i «Finne rader uten samsvar (anti-join)»?

Mønsteret LEFT JOIN / IS NULL for å finne foreldreløse og manglende data. Du øver på Forberedelse til kodeintervjuer med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med Forberedelse til kodeintervjuer?

Ingen tidligere erfaring er nødvendig. Forberedelse til kodeintervjuer på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 3 av 4.

Hvor lang tid tar leksjonen «Finne rader uten samsvar (anti-join)»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne Forberedelse til kodeintervjuer-leksjonen?

Ja. Alle Forberedelse til kodeintervjuer-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. LEFT JOIN og bevaring av rader uten samsvar
  2. Semantikken til RIGHT og FULL OUTER JOIN
  3. Finne rader uten samsvar (anti-join)
  4. Fellen med WHERE på outer join
← Tilbake til Forberedelse til kodeintervjuer