Forberedelse til kodeintervjuer · leksjon

BETWEEN, IN og inkluderende grenser

Lær om grensetilfeller og hvordan BETWEEN behandler endepunkter.

Leksjon 2 av 413 trinn

BETWEEN, IN og inkluderende grenser er en gratis leksjon i Forberedelse til kodeintervjuer på CoddyKit. Dette er leksjon 2 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.

Hvorfor grenser koster kandidater poeng

Intervall- og mengdefiltre virker trivielle, så intervjuere utnytter kanttilfellene. BETWEEN inkluderer begge endepunktene, IN skjuler en subtil NULL-felle, og datointervaller er stedet der feil med ett trinn ubemerket ødelegger rapporter.

Denne leksjonen viser nøyaktig hvordan BETWEEN behandler endepunktene, når IN er renere enn kjedede OR-er, og mønsteret med halvåpne intervaller som fagfolk bruker for datoer.

BETWEEN inkluderer begge endepunktene

col BETWEEN a AND b er en forkortelse for col >= a AND col <= b. Begge endepunktene er inkludert.

price BETWEEN 10 AND 20 returnerer derfor rader der prisen er nøyaktig 10 eller nøyaktig 20, i tillegg til alle verdier imellom. Det vanligste feilaktige svaret i intervjuer er å påstå at den øvre grensen er ekskludert.

SELECT *
FROM products
WHERE price BETWEEN 10 AND 20;
-- equivalent to: price >= 10 AND price <= 20

Rekkefølgen på argumentene er viktig

BETWEEN krever den laveste verdien først. col BETWEEN 20 AND 10 utvides til col >= 20 AND col <= 10, noe som aldri kan være sant. Resultatet blir derfor ingen rader, ikke en feil.

Dette er en vanlig felle: spørringen kjører uten problemer, returnerer ingenting, og kandidaten antar at datasettet er tomt. Sett alltid den minste grensen først.

SELECT *
FROM products
WHERE price BETWEEN 20 AND 10;
-- returns NOTHING, not an error

Feilen med datointervallet

Når De blir bedt om hele januar, skriver mange kandidater order_date BETWEEN '2024-01-01' AND '2024-01-31'. Hvis order_date er et tidsstempel, utelater dette alt etter midnatt den 31., fordi 2024-01-31 betyr 2024-01-31 00:00:00.

En ordre klokken 14 den 31. januar blir dermed utelatt. Med rene DATE-kolonner fungerer dette, men De kan ikke anta at De kjenner typen.

SELECT *
FROM orders
WHERE order_date BETWEEN '2024-01-01' AND '2024-01-31';
-- silently excludes Jan 31 afternoon if order_date is a timestamp

Løsningen med halvåpent intervall

Det profesjonelle mønsteret for datoer er et halvåpent intervall: større enn eller lik starttidspunktet og strengt mindre enn neste periode. Det er riktig for både DATE og TIMESTAMP og krever ingen kunnskap om kolonnens tidsoppløsning.

Legg merke til at den øvre grensen er den første dagen i februar, ikke den siste dagen i januar. Dermed fanges hvert eneste tidspunkt i januar opp.

SELECT *
FROM orders
WHERE order_date >= '2024-01-01'
  AND order_date <  '2024-02-01';

NOT BETWEEN

col NOT BETWEEN a AND b utvides til col < a OR col > b. Det ekskluderer begge endepunktene og alt imellom.

Vær oppmerksom på at hvis col er NULL, evalueres NOT BETWEEN til UNKNOWN. NULL-rader utelates derfor akkurat som med vanlig BETWEEN. NULL-verdier tilfredsstiller aldri en intervalltest, uansett retning.

SELECT *
FROM products
WHERE price NOT BETWEEN 10 AND 20;
-- price < 10 OR price > 20

IN som mengdetilhørighet

col IN (a, b, c) er en forkortelse for col = a OR col = b OR col = c. Det er den ryddige måten å teste om en verdi tilhører en liten, fast mengde.

Det er mer lesbart enn en kjede med OR-er og unngår hele problemet med parenteser rundt operatorprioriteten, siden hele mengdetesten er ett predikat.

SELECT *
FROM orders
WHERE status IN ('pending', 'shipped', 'delivered');

Fellen med NULL i NOT IN

Dette er det mest fryktede spørsmålet om IN. Hvis listen eller underspørringen bak NOT IN inneholder én eneste NULL, kan hele predikatet evalueres til UNKNOWN og returnere ingen rader.

Grunnen er at x NOT IN (1, NULL) blir til x <> 1 AND x <> NULL, og x <> NULL er aldri sant, men UNKNOWN. Hele AND-uttrykket kan derfor aldri bli sant.

SELECT *
FROM employees
WHERE manager_id NOT IN (SELECT id FROM managers);
-- returns NOTHING if any managers.id is NULL

Korrigering av NOT IN

To robuste løsninger på NOT IN-fellen med NULL:

  • Filtrer NULL-verdier ut av underspørringen med WHERE id IS NOT NULL
  • Enda bedre: skriv det om til NOT EXISTS, som håndterer NULL-verdier riktig fra utgangspunktet

Intervjuere regner NOT EXISTS som svaret på seniornivå fordi det omgår hele fellen og ofte gir en bedre utførelsesplan.

SELECT e.*
FROM employees e
WHERE NOT EXISTS (
  SELECT 1 FROM managers m WHERE m.id = e.manager_id
);

IN med en underspørring

IN aksepterer en underspørring som returnerer én kolonne. WHERE customer_id IN (SELECT customer_id FROM vip) beholder rader der kunden finnes i VIP-mengden.

Vanlig IN, i motsetning til NOT IN, er trygt når underspørringen inneholder NULL-verdier: en NULL i listen gir ganske enkelt aldri treff, men påvirker ikke radene som faktisk har treff. Fellen gjelder spesifikt NOT IN.

SELECT *
FROM orders
WHERE customer_id IN (SELECT customer_id FROM vip_customers);

IN med flere kolonner ved hjelp av radkonstruktører

Et vanlig oppfølgingsspørsmål er hvordan De matcher på mer enn én kolonne samtidig. Send en tuppel til IN ved hjelp av en radkonstruktør. Den sammenligner kolonnene posisjonelt og er langt ryddigere enn å kjede sammen OR (a = .. AND b = ..).

  • Det er lett å lese og skalerer til lange tillatelseslister.
  • Hver tuppel må føre opp kolonnene i samme rekkefølge.
SELECT *
FROM orders
WHERE (customer_id, status) IN ((101, 'paid'), (102, 'shipped'));

Rask kontroll

Husk hvordan BETWEEN behandler endepunktene.

Oppsummering

Viktigste punkter:

  • BETWEEN a AND b inkluderer begge endepunktene; den nedre grensen må komme først, ellers får De ingen rader
  • Bruk et halvåpent intervall for tidsstempelintervaller: >= start AND < next_period
  • IN gir ryddig mengdetilhørighet og er trygt med NULL-verdier
  • NOT IN med en hvilken som helst NULL i listen returnerer ingenting; skriv det om til NOT EXISTS

Det gjennomgående poenget er at et filter kan kjøre helt feilfritt og likevel stille returnere feil rader.

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 «BETWEEN, IN og inkluderende grenser» gratis?

Ja – hele teksten i «BETWEEN, IN og inkluderende grenser» 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 «BETWEEN, IN og inkluderende grenser»?

Lær om grensetilfeller og hvordan BETWEEN behandler endepunkter. 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 2 av 4.

Hvor lang tid tar leksjonen «BETWEEN, IN og inkluderende grenser»?

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. AND/OR-presedens og parentesbruk
  2. BETWEEN, IN og inkluderende grenser
  3. LIKE, jokertegn og escaping
  4. Filtrere på beregnede verdier
← Tilbake til Forberedelse til kodeintervjuer