IN-, ANY- og ALL-underforespørgsler
Underforespørgsler med mængdetilhørsforhold og den velkendte fælde med NOT IN og NULL
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.> ANYbetyder større end minimum;> ALLbetyder større end maksimum.NOT INmed en NULL i underforespørgslen returnerer i stilhed ingen rækker — brugIS NOT NULLellerNOT EXISTS.- Almindelig
INaccepterer NULL-værdier;INmed flere kolonner fungerer i nogle dialekter.
Næste: EXISTS kontra IN og spørgsmålet om ydeevne, som altid dukker op i seniorinterviews.
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
- Skalære underforespørgsler i SELECT og WHERE
- Underforespørgsler i FROM-klausulen (afledte tabeller)
- IN-, ANY- og ALL-underforespørgsler
- Ydelse for EXISTS kontra IN