En korrelerad underfrågas anatomi
Så refererar den inre frågan till den yttre raden och så fungerar körningen rad för rad
En korrelerad underfrågas anatomi är en gratis lektion i Förberedelser inför SQL-intervjun på CoddyKit. Detta är lektion 1 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.
Vad som gör en underfråga korrelerad
Intervjuare delar in underfrågor i två grupper. En enkel (okorrelerad) underfråga kan köras på egen hand. En korrelerad underfråga refererar till en kolumn från den yttre frågan, så den kan inte köras fristående.
- Okorrelerad: utvärderas en gång och resultatet återanvänds för varje yttre rad.
- Korrelerad: utvärderas på nytt en gång per yttre rad, eftersom den beror på den raden.
Det tydligaste tecknet är att en kolumn från den yttre tabellen förekommer inuti den inre frågan. Upptäck det, så kan Ni namnge mönstret direkt.
Exekveringsmodellen rad för rad
Föreställ er att motorn itererar över de yttre raderna. För varje yttre rad infogar den radens värden i den inre frågan, kör den och använder resultatet för att avgöra eller beräkna något.
Det här är den mentala modell som intervjuare vill att ni ska kunna förklara: "den inre frågan körs en gång för varje yttre rad".
Den formuleringen antyder också den klassiska följdfrågan: korrelerade underfrågor kan vara långsamma eftersom den inre frågan kan köras tusentals gånger. Det åtgärdar vi i lektion 4.
Så hittar ni den yttre referensen
Här driver employees och ett yttre alias för löneuppgifter, e1, en inre fråga som läser e1.dept_id. Den referensen till den yttre raden är korrelationen.
Om ni tar bort aliasprefixet kan den inre frågan inte längre kompileras fristående. Det beroendet är exakt det som gör frågan korrelerad.
SELECT e1.name, e1.salary
FROM employees e1
WHERE e1.salary > (
SELECT AVG(e2.salary)
FROM employees e2
WHERE e2.dept_id = e1.dept_id
);Läs frågan högt
Översätt den föregående frågan till vanlig svenska, så som ni skulle göra på en intervju:
"För varje anställd e1 hämtar ni den genomsnittliga lönen på den anställdes egen avdelning och behåller bara den anställda om lönen är högre än avdelningens genomsnitt."
Den inre frågans WHERE e2.dept_id = e1.dept_id kopplar genomsnittet till den här anställdas avdelning. Utan den raden skulle ni jämföra alla med genomsnittet för hela företaget i stället.
Aliasnamn är obligatoriska
När den inre och den yttre frågan berör samma tabell måste ni ge båda aliasnamn, så att motorn vet vilken rad en kolumn hör till.
e1= den yttre raden som testas.e2= den inre genomgången av tabellen.
Om ni tar bort aliasnamnen blir dept_id tvetydigt. Många motorer binder då kolumnen tyst till den inre tabellen, vilket förstör korrelationen. Intervjuare planterar ofta in exakt det här misstaget.
Korrelaterad underfråga i SELECT
Korrelerade underfrågor är inte begränsade till WHERE. I en SELECT-lista skapar de en beräknad kolumn som återigen utvärderas för varje yttre rad.
Nedan visas för varje order hur många andra order som samma kund har lagt. Den inre räkningen korreleras via o.customer_id.
SELECT o.order_id,
o.customer_id,
(SELECT COUNT(*)
FROM orders o2
WHERE o2.customer_id = o.customer_id) AS customer_order_count
FROM orders o;Skalär betyder exakt ett värde
En korrelerad underfråga som används i SELECT eller jämförs med =, >, < måste returnera ett enda skalärt värde för varje yttre rad.
Om den returnerar mer än en rad genererar databasen ett fel, till exempel "subquery returns more than one row."
Aggregat som COUNT, MAX och AVG garanterar ett värde, vilket är anledningen till att de ofta används i skalära korrelerade underfrågor. Om ni känner till den här regeln undviker ni en vanlig överraskning vid körning.
När underfrågan returnerar NULL
En skalär korrelerad underfråga kan matcha noll inre rader. Ett aggregat returnerar då NULL (eller, för COUNT, 0).
Det NULL-värdet förs vidare till ert yttre uttryck. Jämförelser med NULL ger UNKNOWN, så den yttre raden kan tyst filtreras bort.
Om ni behöver ett reservvärde kan ni omsluta underfrågan med COALESCE. Intervjuare frågar gärna vad som händer när ingen inre rad matchar och förväntar sig att ni nämner NULL-beteendet.
SELECT c.customer_id,
COALESCE((SELECT MAX(o.amount)
FROM orders o
WHERE o.customer_id = c.customer_id), 0) AS biggest_order
FROM customers c;Genomarbetat exempel: Senaste orderdatum
En vanlig uppgift är att visa varje kund tillsammans med datumet för kundens senaste order. En korrelerad underfråga i SELECT löser det direkt.
För varje kundrad hittar den inre frågan det högsta orderdatumet för den kunden via o.customer_id = c.customer_id.
SELECT c.customer_id,
c.name,
(SELECT MAX(o.order_date)
FROM orders o
WHERE o.customer_id = c.customer_id) AS last_order_date
FROM customers c;Varför det kan gå långsamt
Eftersom den inre frågan körs en gång per yttre rad kan en korrelerad underfråga över en stor yttre tabell utlösa miljontals inre körningar.
- Ett index på den korrelerade kolumnen (här
orders.customer_id) gör att varje inre körning kan slutföras snabbt. - Utan index kan varje körning behöva läsa igenom hela tabellen, vilket ger ungefär O(n*m) arbete.
På intervjuer bör ni alltid nämna indexet och omskrivningen till en join som era verktyg för att förbättra prestandan.
Korrelerad kontra okorrelerad sida vid sida
Skillnaden består av en rad. Den okorrelerade versionen jämför alla med genomsnittet för hela företaget, medan den korrelerade versionen jämför varje person med den egna avdelningen.
Läs båda och lägg märke till hur den enda raden WHERE e2.dept_id = e1.dept_id förändrar hela betydelsen.
-- Uncorrelated: one global average, computed once
SELECT name FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);
-- Correlated: per-department average, recomputed per row
SELECT e1.name FROM employees e1
WHERE e1.salary > (
SELECT AVG(e2.salary) FROM employees e2
WHERE e2.dept_id = e1.dept_id
);Snabbtest
Testa hur väl ni förstår vad som kännetecknar en korrelerad underfråga.
Sammanfattning: En korrelerad underfrågas anatomi
Viktiga slutsatser:
- En korrelerad underfråga refererar till den yttre raden och körs en gång per yttre rad.
- Ge båda tabellerna aliasnamn när det är samma tabell, så att korrelationen förblir entydig.
- Skalär användning måste returnera exakt ett värde. Noll träffar ger NULL, så skydda med
COALESCE. - Den kan placeras i SELECT eller WHERE, och prestandan beror på indexering av den korrelerade kolumnen.
Säg "körs en gång per yttre rad" på intervjun, så har ni fångat kärnan i konceptet.
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 ”En korrelerad underfrågas anatomi” gratis?
Ja – hela texten till ”En korrelerad underfrågas anatomi” 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 ”En korrelerad underfrågas anatomi”?
Så refererar den inre frågan till den yttre raden och så fungerar körningen rad för rad 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 1 av 4.
Hur lång tid tar lektionen ”En korrelerad underfrågas anatomi”?
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
- En korrelerad underfrågas anatomi
- Aggregeringar per grupp utan GROUP BY
- Korrelerade EXISTS och NOT EXISTS
- Skriv om korrelerade underfrågor som joinar