Förberedelser inför SQL-intervjun · Lektion

Underfrågor i FROM-satsen (härledda tabeller)

Omslut en fråga som en virtuell tabell och förstå varför alias är obligatoriska

Lektion 2 av 413 steg

Underfrågor i FROM-satsen (härledda tabeller) är en gratis lektion i Förberedelser inför SQL-intervjun på CoddyKit. Detta är lektion 2 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 en härledd tabell är

En underfråga i FROM-satsen kallas en härledd tabell (eller inline view). I stället för att returnera ett enda värde returnerar den en hel resultatuppsättning som den yttre frågan behandlar som om den vore en riktig tabell.

  • Den kan ha många rader och många kolumner.
  • Du kan ställa frågor mot den, joina den och filtrera den som vilken tabell som helst.

Intervjuare använder härledda tabeller för att testa om du kan dela upp ett problem i steg.

Alias är obligatoriska

Den vanligaste fallgropen: en härledd tabell måste ha ett alias. Utan ett alias avvisar de flesta databasmotorer frågan.

  • MySQL: Varje härledd tabell måste ha sitt eget alias.
  • Postgres: Underfrågan i FROM måste ha ett alias.

Ge den ett namn (här dept_avg) så kan du referera till kolumnerna med det namnet.

SELECT dept_avg.dept_id, dept_avg.avg_salary
FROM (
  SELECT dept_id, AVG(salary) AS avg_salary
  FROM employees
  GROUP BY dept_id
) AS dept_avg;

Varför föraggregering i en härledd tabell

Ett vanligt intervjuproblem är: visa varje anställd tillsammans med genomsnittslönen för den anställdes avdelning. Du kan inte blanda detaljraden med ett aggregat direkt utan att stöta på grupperingsproblem.

Det rena tillvägagångssättet är att beräkna genomsnittet per avdelning i en härledd tabell och sedan joina tillbaka det till detaljraderna. Den härledda tabellen reduceras först till en rad per avdelning.

SELECT e.name, e.salary, d.avg_salary
FROM employees e
JOIN (
  SELECT dept_id, AVG(salary) AS avg_salary
  FROM employees
  GROUP BY dept_id
) AS d ON e.dept_id = d.dept_id;

Filtrering av ett aggregerat resultat

Härledda tabeller gör att du kan filtrera på ett beräknat aggregat utan krångel med HAVING i den yttre frågan. Anta att vi bara vill ha avdelningar vars genomsnittslön överstiger 60000.

Vi aggregerar internt och använder sedan en vanlig WHERE på den härledda kolumnen externt. Den yttre frågan ser avg_salary som en vanlig kolumn.

SELECT dept_id, avg_salary
FROM (
  SELECT dept_id, AVG(salary) AS avg_salary
  FROM employees
  GROUP BY dept_id
) AS d
WHERE avg_salary > 60000;

Två aggregeringsnivåer

Härledda tabeller är särskilt användbara när du behöver ett aggregat av ett aggregat — en klassisk intervjufråga: vad är genomsnittet av avdelningarnas genomsnittslöner?

Du kan inte kapsla AVG(AVG(...)) direkt. Den inre frågan producerar ett genomsnitt per avdelning; den yttre frågan beräknar genomsnittet av dessa.

SELECT AVG(avg_salary) AS avg_of_dept_avgs
FROM (
  SELECT dept_id, AVG(salary) AS avg_salary
  FROM employees
  GROUP BY dept_id
) AS d;

Namnge beräknade kolumner

Alla uttryck i en härledd tabell behöver ett alias om du vill referera till dem utanför den. Uttrycket salary * 12 skulle annars få ett databasgenererat namn som du inte kan förlita dig på.

Ge alltid beräknade kolumner alias — intervjuare lägger märke till när du refererar till ett uttryck utan alias och antar ett kolumnnamn som kanske inte finns.

SELECT name, annual_salary
FROM (
  SELECT name, salary * 12 AS annual_salary
  FROM employees
) AS yearly
WHERE annual_salary > 100000;

Koppla samman två härledda tabeller

Du kan joina flera härledda tabeller med varandra. Här jämför vi varje avdelnings antal anställda med dess totala lönekostnad genom att joina två föraggregerade underfrågor.

Varje härledd tabell besvarar en delfråga; joinen sätter ihop dem till den slutliga rapporten. Detta stegvisa sätt att tänka är precis det som intervjuer på mellannivå belönar.

SELECT c.dept_id, c.headcount, p.payroll
FROM (
  SELECT dept_id, COUNT(*) AS headcount
  FROM employees GROUP BY dept_id
) AS c
JOIN (
  SELECT dept_id, SUM(salary) AS payroll
  FROM employees GROUP BY dept_id
) AS p ON c.dept_id = p.dept_id;

Scope: Den yttre frågan kan inte se inuti

En viktig regel är att den yttre frågan bara kan referera till de kolumner som den härledda tabellen exponerar i sin SELECT-lista. Kolumner som endast används inuti underfrågan är osynliga utanför den.

Om den inre frågan väljer dept_id och avg_salary är salary eller name inte tillgängliga utanför — de användes i aggregeringen. Intervjuare undersöker denna scope-gräns.

SELECT dept_id, avg_salary
FROM (
  SELECT dept_id, AVG(salary) AS avg_salary
  FROM employees GROUP BY dept_id
) AS d;

Härledd tabell kontra CTE

En härledd tabell och en Common Table Expression (CTE) ger ofta samma exekveringsplan. Intervjuare kan fråga varför du skulle välja den ena framför den andra:

  • Härledd tabell: infogad direkt i frågan, lämplig för engångsanvändning.
  • CTE (WITH): namngiven högst upp, lättläst och återanvändbar om den refereras flera gånger.

För djupt nästlad logik läses en CTE-pipeline uppifrån och ned; en härledd tabell läses inifrån och ut.

WITH dept_avg AS (
  SELECT dept_id, AVG(salary) AS avg_salary
  FROM employees GROUP BY dept_id
)
SELECT * FROM dept_avg WHERE avg_salary > 60000;

LATERAL / korrelerad FROM-underfråga

Normalt kan en underfråga i FROM inte referera till rader i den yttre frågan. LATERAL (Postgres) eller CROSS APPLY (SQL Server) häver den begränsningen och gör att den härledda tabellen kan köras för varje yttre rad.

Detta möjliggör top-N-uppslag per rad. Att känna till att nyckelordet finns visar senior förståelse även i en intervju på mellannivå.

SELECT d.dept_name, top_emp.name, top_emp.salary
FROM departments d
CROSS JOIN LATERAL (
  SELECT name, salary FROM employees e
  WHERE e.dept_id = d.id
  ORDER BY salary DESC LIMIT 1
) AS top_emp;

Intervjuformulering

Om Ni får en fråga om underfrågor i FROM-satsen kan Ni säga: "En härledd tabell är en underfråga i FROM som returnerar en resultatmängd som den yttre frågan använder som en tabell. Den måste ha ett alias, den yttre frågan kan bara se de kolumner som underfrågan väljer ut, och den passar utmärkt för att föraggregera före en join eller för att aggregera ett aggregat."

Lägg till att LATERAL gör att den kan referera till rader i den yttre frågan, så har Ni täckt alla aspekter.

Snabbtest

Välj det påstående som alltid krävs för en underfråga i FROM-satsen.

Sammanfattning

Härledda tabeller, fastslagna:

  • En underfråga i FROM returnerar en virtuell tabell — många rader, många kolumner.
  • Den måste ha ett alias; den yttre frågan ser bara de kolumner som den väljer ut.
  • Använd den för att föraggregera före en join, filtrera på aggregat eller aggregera ett aggregat.
  • En CTE är det lättlästa, namngivna alternativet; LATERAL/CROSS APPLY gör att den kan referera till rader i den yttre frågan.

Nästa: underfrågor för mängdmedlemskap med IN, ANY och ALL.

Gratis att börja

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 ”Underfrågor i FROM-satsen (härledda tabeller)” gratis?

Ja – hela texten till ”Underfrågor i FROM-satsen (härledda tabeller)” 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 ”Underfrågor i FROM-satsen (härledda tabeller)”?

Omslut en fråga som en virtuell tabell och förstå varför alias är obligatoriska 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 2 av 4.

Hur lång tid tar lektionen ”Underfrågor i FROM-satsen (härledda tabeller)”?

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

  1. Skalära underfrågor i SELECT och WHERE
  2. Underfrågor i FROM-satsen (härledda tabeller)
  3. IN-, ANY- och ALL-underfrågor
  4. EXISTS kontra IN – prestanda
← Tillbaka till Förberedelser inför SQL-intervjun