Forberedelse til kodeinterviews · Lektion

IN-, ANY- og ALL-underforespørgsler

Underforespørgsler med mængdetilhørsforhold og den velkendte fælde med NOT IN og NULL

Lektion 3 af 413 trin

IN-, ANY- og ALL-underforespørgsler er en gratis Forberedelse til kodeinterviews-lektion på CoddyKit. Dette er lektion 3 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.

Underforespørgsler om mængdetilhørighed

Når en underforespørgsel returnerer en liste med værdier, tester du mængdetilhørighed med IN, ANY eller ALL. Sådan spørger SQL, om denne værdi tilhører den mængde? eller overgår den alle eller et vilkårligt element i den mængde?

  • IN — matcher enhver værdi på listen.
  • ANY/SOME — er sand, hvis sammenligningen gælder for mindst ét element.
  • ALL — er kun sand, hvis den gælder for hvert element.

IN med en underforespørgsel

Det typiske tilfælde: Find medarbejdere, der arbejder i en afdeling, som ligger i 'NYC'. Underforespørgslen returnerer et sæt af afdelings-id'er, og IN beholder rækker, der matcher en af dem.

Det er naturligt at læse, og det er den form, interviewere forventer som det første.

SELECT name
FROM employees
WHERE dept_id IN (
  SELECT id FROM departments WHERE city = 'NYC'
);

= ANY er det samme som IN

En elegant ækvivalens, som interviewere kan lide: = ANY (subquery) betyder præcis det samme som IN (subquery). Begge er sande, når værdien er lig med mindst ét element i mængden.

Forespørgslen nedenfor returnerer præcis samme resultat som den foregående. ANY og synonymet SOME generaliserer dette til andre operatorer som > og <.

SELECT name
FROM employees
WHERE dept_id = ANY (
  SELECT id FROM departments WHERE city = 'NYC'
);

ANY med en sammenligningsoperator

ANY bliver stærk med > eller <. salary > ANY (set) er sandt, hvis lønnen er større end mindst det mindste element — altså større end minimum.

Det finder medarbejdere, der tjener mere end mindst én person i afdeling 5.

SELECT name, salary
FROM employees
WHERE salary > ANY (
  SELECT salary FROM employees WHERE dept_id = 5
);

ALL med en sammenligningsoperator

salary > ALL (set) er kun sandt, hvis lønnen er større end hvert element — altså større end maksimum. Det finder medarbejdere, der tjener mere end alle i afdeling 5.

Husk genvejen: > ALL = større end MAX, > ANY = større end MIN. Interviewere tester dette hele tiden.

SELECT name, salary
FROM employees
WHERE salary > ALL (
  SELECT salary FROM employees WHERE dept_id = 5
);

NOT IN: Den berømte NULL-fælde

Her er den mest almindelige fælde ved underforespørgsler i interviews. Hvis underforespørgslen i en NOT IN returnerer bare én NULL, kan hele NOT IN give ingen rækker — ikke de forældreløse poster, du forventede.

Hvorfor? x NOT IN (1, 2, NULL) udvides til x <> 1 AND x <> 2 AND x <> NULL. Den sidste sammenligning er UNKNOWN, så AND kan aldrig være sand.

SELECT name
FROM customers
WHERE id NOT IN (
  SELECT customer_id FROM orders
);

Hvorfor den forespørgsel fejler i stilhed

Hvis orders.customer_id kan indeholde NULL, og en hvilken som helst række har NULL dér, returnerer den foregående forespørgsel nul rækker, selv om der tydeligvis findes kunder uden ordrer.

  • Tilstedeværelsen af NULL gør logikken til UNKNOWN.
  • Det giver ikke en fejl — det returnerer bare et forkert, tomt resultat.

Hvis du siger denne risiko højt under et interview, er det et stærkt signal.

Sådan løser du NOT IN med NULL

Tre sikre løsninger, som interviewere accepterer:

  • Udeluk NULL-værdier i underforespørgslen: tilføj WHERE customer_id IS NOT NULL.
  • Omskriv med NOT EXISTS, som håndterer NULL-værdier korrekt.
  • Brug en LEFT JOIN ... IS NULL-anti-join.

Den beskyttede version nedenfor returnerer den korrekte liste over kunder uden ordrer.

SELECT name
FROM customers
WHERE id NOT IN (
  SELECT customer_id FROM orders
  WHERE customer_id IS NOT NULL
);

IN fungerer fint med NULL

Et beroligende modpunkt: en almindelig IN (ikke negeret) bliver ikke ødelagt af NULL-værdier på listen. x IN (1, 2, NULL) er sandt, hvis x er lig med 1 eller 2; NULL giver bare aldrig et match.

Faren ved NULL gælder specifikt for NOT IN. At kende forskellen mellem de to tilfælde er præcis det, der adskiller et sikkert svar fra et gæt.

IN med flere kolonner

Visse dialekter (Postgres, MySQL) tillader IN over en tupel af kolonner, så par matcher på én gang. Det finder ordrelinjer, hvis (product, region)-kombination findes i en kampagnetabel.

SQL Server understøtter ikke IN med rækkeværdier; du ville omskrive det med EXISTS dér. Hvis du nævner denne forskel i portabilitet, imponerer det interviewere.

SELECT *
FROM order_lines
WHERE (product_id, region) IN (
  SELECT product_id, region FROM promotions
);

Interviewcitat

Sig dette: "IN tester mængdetilhørighed og er lig med = ANY. Med sammenligningsoperatorer betyder > ANY større end minimum, og > ALL betyder større end maksimum. Den store fælde er NOT IN mod en underforespørgsel, der kan returnere NULL — den returnerer i stilhed ingen rækker, så jeg beskytter mig med IS NOT NULL eller skifter til NOT EXISTS."

Det svar dækker mængdetilhørighed, semantikken for ANY/ALL og NULL-fælden i én mundfuld.

Hurtigt tjek

Interviewernes foretrukne underforespørgselsfælde.

Opsamling

Underforespørgsler om mængdetilhørighed, helt på plads:

  • IN = = ANY: matcher ethvert element i mængden.
  • > ANY betyder større end minimum; > ALL betyder større end maksimum.
  • NOT IN med en NULL i underforespørgslen returnerer i stilhed ingen rækker — brug IS NOT NULL eller NOT EXISTS.
  • Almindelig IN accepterer NULL-værdier; IN med flere kolonner fungerer i nogle dialekter.

Næste: EXISTS kontra IN og spørgsmålet om ydeevne, som altid dukker op i seniorinterviews.

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 “IN-, ANY- og ALL-underforespørgsler” gratis?

Ja — hele teksten til “IN-, ANY- og ALL-underforespørgsler” 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 “IN-, ANY- og ALL-underforespørgsler”?

Underforespørgsler med mængdetilhørsforhold og den velkendte fælde med NOT IN og NULL 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 3 af 4.

Hvor lang tid tager lektionen “IN-, ANY- og ALL-underforespørgsler”?

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. Skalære underforespørgsler i SELECT og WHERE
  2. Underforespørgsler i FROM-klausulen (afledte tabeller)
  3. IN-, ANY- og ALL-underforespørgsler
  4. Ydelse for EXISTS kontra IN
← Tilbage til Forberedelse til kodeinterviews