Underspørringer i FROM-klausulen (avledede tabeller)
Pakk inn en spørring som en virtuell tabell, og lær hvorfor aliaser er obligatoriske.
Underspørringer i FROM-klausulen (avledede tabeller) er en gratis leksjon i Forberedelse til kodeintervjuer på CoddyKit. Dette er leksjon 2 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Forberedelse til kodeintervjuer, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Forberedelse til kodeintervjuer inneholder totalt 4 leksjoner.
Hva en avledet tabell er
En underforespørsel i FROM-klausulen kalles en avledet tabell (eller inline view). I stedet for å returnere én enkelt verdi returnerer den et helt resultatsett som den ytre spørringen behandler som om det var en ekte tabell.
- Den kan ha mange rader og mange kolonner.
- De kan spørre mot den, koble den sammen med andre tabeller og filtrere den som enhver annen tabell.
Intervjuere bruker avledede tabeller for å teste om De kan dele opp et problem i trinn.
Aliaser er obligatoriske
Den vanligste fellen: En avledet tabell må ha et alias. Uten alias avviser de fleste motorer spørringen.
- MySQL: Alle avledede tabeller må ha sitt eget alias.
- Postgres: Underforespørselen i FROM må ha et alias.
Gi den et navn, her dept_avg, så kan De referere til kolonnene med dette navnet.
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;Hvorfor forhåndsaggregere i en avledet tabell
Et vanlig intervjuproblem er: vis hver ansatt sammen med gjennomsnittslønnen i avdelingen. De kan ikke blande detaljraden med en aggregatfunksjon direkte uten å støte på grupperingsproblemer.
Den ryddige fremgangsmåten er å beregne gjennomsnittet per avdeling i en avledet tabell og deretter koble resultatet tilbake til detaljradene. Den avledede tabellen reduseres først til én rad per avdeling.
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;Filtrere på et aggregert resultat
Avledede tabeller lar Dem filtrere på et beregnet aggregat uten kronglete HAVING-logikk i den ytre spørringen. Anta at De bare ønsker avdelinger med en gjennomsnittslønn over 60000.
Vi aggregerer internt og bruker deretter en vanlig WHERE på den avledede kolonnen utenfor. Den ytre spørringen ser avg_salary som en vanlig kolonne.
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;To aggregeringsnivåer
Avledede tabeller er svært nyttige når De trenger et aggregat av et aggregat — et klassisk intervjuspørsmål: hva er gjennomsnittet av gjennomsnittslønnen per avdeling?
De kan ikke nøste AVG(AVG(...)) direkte. Den indre spørringen produserer ett gjennomsnitt per avdeling, og den ytre spørringen beregner gjennomsnittet av disse.
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;Gi beregnede kolonner navn
Alle uttrykk i en avledet tabell trenger et alias hvis De vil referere til dem utenfor tabellen. Det indre salary * 12 ville ellers fått et databasedefinert navn som De ikke kan stole på.
Gi alltid beregnede kolonner aliaser — intervjuere legger merke til når De refererer til et uttrykk uten alias og antar et kolonnenavn som kanskje ikke finnes.
SELECT name, annual_salary
FROM (
SELECT name, salary * 12 AS annual_salary
FROM employees
) AS yearly
WHERE annual_salary > 100000;Koble sammen to avledede tabeller
De kan koble sammen flere avledede tabeller. Her sammenligner vi antallet ansatte i hver avdeling med den samlede lønnskostnaden ved å koble sammen to forhåndsaggregerte underforespørsler.
Hver avledede tabell besvarer ett delspørsmål; join-operasjonen setter dem sammen til den endelige rapporten. Denne trinnvise tenkemåten er nettopp det intervjuer på mellomnivå belønner.
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;Omfang: Den ytre spørringen kan ikke se inn
En viktig regel er at den ytre spørringen bare kan referere til kolonnene den avledede tabellen eksponerer i SELECT-listen. Kolonner som bare brukes inne i underforespørselen, er usynlige utenfor den.
Hvis den indre spørringen velger dept_id og avg_salary, er salary eller name ikke tilgjengelige utenfor — de ble brukt opp av aggregeringen. Intervjuere undersøker denne grensen for virkeområdet.
SELECT dept_id, avg_salary
FROM (
SELECT dept_id, AVG(salary) AS avg_salary
FROM employees GROUP BY dept_id
) AS d;Avledet tabell kontra CTE
En avledet tabell og et Common Table Expression (CTE) produserer ofte samme kjøreplan. Intervjuere kan spørre hvorfor De vil velge den ene fremfor den andre:
- Avledet tabell: innebygd i spørringen, egnet for engangsbruk.
- CTE (
WITH): navngis øverst, er lettlest og kan gjenbrukes hvis den refereres til flere ganger.
For dypt nøstet logikk er en CTE-kjede lett å lese ovenfra og ned; en avledet tabell leses innenfra og 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 / korrelert FROM-underforespørsel
Vanligvis kan ikke en underforespørsel i FROM referere til radene i den ytre spørringen. LATERAL (Postgres) eller CROSS APPLY (SQL Server) opphever denne begrensningen og lar den avledede tabellen kjøres for hver ytre rad.
Dette muliggjør top-N-oppslag per rad. Kunnskap om at nøkkelordet finnes, signaliserer seniorforståelse selv i et intervju på mellomnivå.
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;Intervjuets kortversjon
Hvis De blir spurt om underforespørsler i FROM-leddet, kan De si: "En avledet tabell er en underforespørsel i FROM som returnerer et resultatsett den ytre spørringen bruker som en tabell. Den må ha et alias, den ytre spørringen kan bare se kolonnene den velger ut, og den egner seg svært godt til forhåndsaggregering før en join eller til å aggregere et aggregat."
Legg til at LATERAL gjør at den kan referere til rader i den ytre spørringen, så har De dekket alle aspekter.
Rask kontroll
Velg påstanden som alltid kreves for en underforespørsel i FROM-leddet.
Oppsummering
Avledede tabeller, på plass:
- En underforespørsel i FROM returnerer en virtuell tabell — mange rader og mange kolonner.
- Den må ha et alias; den ytre spørringen ser bare de valgte kolonnene.
- Bruk den til å forhåndsaggregere før en join, filtrere på aggregater eller aggregere et aggregat.
- En CTE er det lesbare, navngitte alternativet;
LATERAL/CROSS APPLYgjør at den kan referere til rader i den ytre spørringen.
Neste: underforespørsler for mengdetilhørighet med IN, ANY og ALL.
Lær deg Forberedelse til kodeintervjuer med en AI-veileder – gratis
Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.
- Kurs
- 90
- Leksjoner
- 360
Ofte stilte spørsmål
Er leksjonen «Underspørringer i FROM-klausulen (avledede tabeller)» gratis?
Ja – hele teksten i «Underspørringer i FROM-klausulen (avledede tabeller)» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av Forberedelse til kodeintervjuer-kurset, kan du oppgradere til CoddyKit PRO. Kurset i Forberedelse til kodeintervjuer inneholder totalt 4 leksjoner.
Hva lærer jeg i «Underspørringer i FROM-klausulen (avledede tabeller)»?
Pakk inn en spørring som en virtuell tabell, og lær hvorfor aliaser er obligatoriske. Du øver på Forberedelse til kodeintervjuer med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.
Trenger jeg erfaring for å begynne med Forberedelse til kodeintervjuer?
Ingen tidligere erfaring er nødvendig. Forberedelse til kodeintervjuer på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 2 av 4.
Hvor lang tid tar leksjonen «Underspørringer i FROM-klausulen (avledede tabeller)»?
De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.
Kan jeg skrive og kjøre kode i denne Forberedelse til kodeintervjuer-leksjonen?
Ja. Alle Forberedelse til kodeintervjuer-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.
Alle leksjonene i dette kurset
- Skalarunderspørringer i SELECT og WHERE
- Underspørringer i FROM-klausulen (avledede tabeller)
- IN-, ANY- og ALL-underspørringer
- EXISTS versus IN – ytelse