Finne rader uten samsvar (anti-join)
Mønsteret LEFT JOIN / IS NULL for å finne foreldreløse og manglende data.
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 ordersHvorfor 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 NULLforkaster 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 customerTelle 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 kLEFT JOIN other o ON o.fk = k.idWHERE 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 iWHERE, ikke iON.- Den er likeverdig med
NOT EXISTS; foretrekk den fremforNOT 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».
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
- LEFT JOIN og bevaring av rader uten samsvar
- Semantikken til RIGHT og FULL OUTER JOIN
- Finne rader uten samsvar (anti-join)
- Fellen med WHERE på outer join