IN-, ANY- och ALL-underfrågor
Underfrågor för mängdmedlemskap och den välkända fällan med NOT IN och NULL
IN-, ANY- och ALL-underfrågor är en gratis lektion i Förberedelser inför SQL-intervjun på CoddyKit. Detta är lektion 3 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för Förberedelser inför SQL-intervjun, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Förberedelser inför SQL-intervjun innehåller totalt 4 lektioner.
Underfrågor för mängdmedlemskap
När en underfråga returnerar en lista med värden testar Ni medlemskap i den med IN, ANY eller ALL. Det är så SQL frågar finns det här värdet i den mängden? eller är det större än varje / något element i den mängden?
IN— matchar något värde i listan.ANY/SOME— är sant om jämförelsen gäller för minst ett element.ALL— är sant endast om jämförelsen gäller för varje element.
IN med en underfråga
Det vanligaste fallet: hitta anställda som arbetar på en avdelning i 'NYC'. Underfrågan returnerar en mängd avdelnings-ID:n, och IN behåller rader som matchar något av dem.
Det här är lätt att läsa och är den form som intervjuare förväntar sig först.
SELECT name
FROM employees
WHERE dept_id IN (
SELECT id FROM departments WHERE city = 'NYC'
);= ANY är samma som IN
En snygg ekvivalens som intervjuare gillar: = ANY (subquery) betyder exakt samma sak som IN (subquery). Båda är sanna när värdet är lika med minst ett element i mängden.
Frågan nedan returnerar exakt samma resultat som den föregående. ANY och synonymen SOME generaliserar detta till andra operatorer som > och <.
SELECT name
FROM employees
WHERE dept_id = ANY (
SELECT id FROM departments WHERE city = 'NYC'
);ANY med en jämförelseoperator
ANY blir kraftfullt tillsammans med > eller <. salary > ANY (set) är sant om lönen är högre än åtminstone det minsta elementet — det vill säga större än minimum.
Det här hittar anställda som tjänar mer än åtminstone en person på avdelning 5.
SELECT name, salary
FROM employees
WHERE salary > ANY (
SELECT salary FROM employees WHERE dept_id = 5
);ALL med en jämförelseoperator
salary > ALL (set) är sant endast om lönen är högre än varje element — det vill säga större än maximum. Det här hittar anställda som tjänar mer än alla på avdelning 5.
Kom ihåg genvägen: > ALL = större än MAX, > ANY = större än MIN. Intervjuare testar detta hela tiden.
SELECT name, salary
FROM employees
WHERE salary > ALL (
SELECT salary FROM employees WHERE dept_id = 5
);NOT IN: den berömda NULL-fällan
Det här är den vanligaste fallgropen i intervjufrågor om underfrågor. Om underfrågan i en NOT IN returnerar ens en NULL kan hela NOT IN ge inga rader — inte de föräldralösa poster Ni förväntade Er.
Varför? x NOT IN (1, 2, NULL) expanderas till x <> 1 AND x <> 2 AND x <> NULL. Den sista jämförelsen är UNKNOWN, så AND-uttrycket kan aldrig bli sant.
SELECT name
FROM customers
WHERE id NOT IN (
SELECT customer_id FROM orders
);Varför frågan går sönder utan varning
Om orders.customer_id kan innehålla NULL och någon rad har ett NULL-värde där, returnerar den föregående frågan noll rader även när det uppenbart finns kunder utan beställningar.
- Förekomsten av NULL gör att logiken blir
UNKNOWN. - Det uppstår inget fel — frågan returnerar bara felaktiga, tomma resultat.
Att säga detta högt under en intervju är ett starkt tecken på förståelse.
Så åtgärdar Ni NOT IN med NULL
Tre säkra lösningar som intervjuare accepterar:
- Uteslut NULL-värden i underfrågan: lägg till
WHERE customer_id IS NOT NULL. - Skriv om frågan med
NOT EXISTS, som hanterar NULL korrekt. - Använd en
LEFT JOIN ... IS NULL-anti-join.
Den skyddade versionen nedan returnerar den faktiska listan över kunder utan beställningar.
SELECT name
FROM customers
WHERE id NOT IN (
SELECT customer_id FROM orders
WHERE customer_id IS NOT NULL
);IN fungerar bra med NULL
En viktig motpoäng: ett vanligt IN (utan negation) påverkas inte av NULL-värden i listan. x IN (1, 2, NULL) är sant om x är lika med 1 eller 2; NULL matchar helt enkelt aldrig.
NULL-risken är specifik för NOT IN. Att känna till skillnaden mellan fallen är precis det som skiljer ett självsäkert svar från en gissning.
IN med flera kolumner
Vissa dialekter (Postgres, MySQL) tillåter IN över en tupel av kolumner, så att par matchas samtidigt. Det här hittar orderrader vars (product, region)-kombination finns i en kampanjtabell.
SQL Server saknar row-value IN; där skulle Ni skriva om frågan med EXISTS. Att nämna den här portabilitetsbegränsningen imponerar på intervjuare.
SELECT *
FROM order_lines
WHERE (product_id, region) IN (
SELECT product_id, region FROM promotions
);Intervjuformulering
Säg så här: "IN testar mängdmedlemskap och motsvarar = ANY. Med jämförelseoperatorer betyder > ANY större än minimum och > ALL större än maximum. Den stora fällan är NOT IN mot en underfråga som kan returnera NULL — den returnerar tyst inga rader, så jag skyddar med IS NOT NULL eller byter till NOT EXISTS."
Det svaret täcker medlemskap, semantiken för ANY/ALL och NULL-fällan i ett enda andetag.
Snabbtest
Intervjuarens favoritfallgrop med underfrågor.
Sammanfattning
Underfrågor för mängdmedlemskap, bemästrade:
IN== ANY: matchar alla element i mängden.> ANYbetyder större än minimum;> ALLbetyder större än maximum.NOT INmed ett NULL i underfrågan returnerar tyst inga rader — skydda medIS NOT NULLeller användNOT EXISTS.- Vanligt
INtolererar NULL-värden;INmed flera kolumner fungerar i vissa dialekter.
Nästa: EXISTS kontra IN och prestandafrågan som ofta ställs i seniorintervjuer.
Lär dig SQL med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 30
- Lektioner
- 120
Vanliga frågor
Är lektionen ”IN-, ANY- och ALL-underfrågor” gratis?
Ja – hela texten till ”IN-, ANY- och ALL-underfrågor” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i Förberedelser inför SQL-intervjun, kan Ni uppgradera till CoddyKit PRO. Kursen i Förberedelser inför SQL-intervjun innehåller totalt 4 lektioner.
Vad lär jag mig i ”IN-, ANY- och ALL-underfrågor”?
Underfrågor för mängdmedlemskap och den välkända fällan med NOT IN och NULL Ni övar på Förberedelser inför SQL-intervjun med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig Förberedelser inför SQL-intervjun?
Du behöver inga förkunskaper. Utbildningen i Förberedelser inför SQL-intervjun på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 3 av 4.
Hur lång tid tar lektionen ”IN-, ANY- och ALL-underfrågor”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här Förberedelser inför SQL-intervjun-lektionen?
Ja. Varje Förberedelser inför SQL-intervjun-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.
Alla lektioner i den här kursen
- Skalära underfrågor i SELECT och WHERE
- Underfrågor i FROM-satsen (härledda tabeller)
- IN-, ANY- och ALL-underfrågor
- EXISTS kontra IN – prestanda