Skriv din første CTE
Grundlæggende WITH-syntaks, og hvornår en CTE giver bedre læsbarhed end en underforespørgsel
Skriv din første CTE er en gratis Forberedelse til kodeinterviews-lektion på CoddyKit. Dette er lektion 1 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.
Hvad en CTE faktisk er
Et fælles tabeludtryk (CTE) er et navngivet, midlertidigt resultatsæt, der defineres med nøgleordet WITH, og som kun eksisterer under en enkelt forespørgsel. Interviewere holder af CTE'er, fordi de viser, om du kan strukturere logik tydeligt.
Tænk på en CTE som at give en underforespørgsel et navn, så du kan referere til den som en tabel i den hovedsætning, der følger. Den opretter ikke et permanent objekt og forsvinder, så snart forespørgslen er færdig.
Den grundlæggende WITH-syntaks
Alle CTE'er begynder med WITH, et navn, nøgleordet AS og en forespørgsel i parentes. Efter den afsluttende parentes skriver du en normal sætning, der bruger CTE'en ved navn.
WITH cte_name AS ( ... )definerer blokken.- Forespørgslen lige efter parentesen er hovedforespørgslen.
- CTE-navnet fungerer som en tabel, du kan vælge data fra med SELECT.
WITH recent_orders AS (
SELECT *
FROM orders
WHERE order_date >= '2024-01-01'
)
SELECT *
FROM recent_orders;Hvorfor ikke bare bruge en underforespørgsel?
Den samme logik kan skrives som en indlejret underforespørgsel i FROM-klausulen. Så hvorfor spørger interviewere om CTE'er?
- Læselighed: Et navngivet trin kan læses fra top til bund som en opskrift.
- Genbrug: Du kan referere til den samme CTE flere gange i stedet for at gentage en underforespørgsel.
- Fejlsøgning: Du kan nøjes med at udføre SELECT på CTE'en for at undersøge den.
Det rigtige svar i et interview er som regel: Brug en CTE, når den gør forespørgslen lettere at læse og vedligeholde.
Gennemgået eksempel: Først filtrering, derefter aggregering
Antag, at spørgsmålet er: find den samlede omsætning fra ordrer, der er afgivet i år. En CTE lader dig isolere filtreringstrinnet og derefter aggregere over det navngivne resultat.
Hovedforespørgslen behandler recent_orders, som om det var en rigtig tabel, hvilket holder aggregeringen ren og tydelig.
WITH recent_orders AS (
SELECT amount
FROM orders
WHERE order_date >= '2024-01-01'
)
SELECT SUM(amount) AS total_revenue
FROM recent_orders;Navngivning af resultatkolonnerne
Du kan omdøbe de kolonner, som en CTE viser, ved at angive dem lige efter CTE-navnet. Det er nyttigt, når den indre forespørgsel producerer udtryk, eller når du ønsker tydeligere navne senere i forespørgslen.
Hvis du angiver en kolonneliste, skal den passe med antallet af kolonner, som den indre forespørgsel returnerer, ellers giver databasen en fejl.
WITH revenue (region, total) AS (
SELECT region, SUM(amount)
FROM orders
GROUP BY region
)
SELECT region, total
FROM revenue
ORDER BY total DESC;En CTE er blot en navngivet forespørgsel
En tankemodel, der imponerer interviewere, er, at en CTE logisk svarer til at indsætte dens definition direkte. Databasen kan vælge at indlejre den eller materialisere den, men resultatet er semantisk det samme, som hvis du havde indsat underforespørgslen.
Det betyder, at alt, der er lovligt i en almindelig SELECT, også er lovligt i en CTE: joins, GROUP BY, WHERE, vinduesfunktioner og meget mere.
Dybere eksempel: CTE med et join
CTE'er er særligt nyttige, når du skal forberede den ene side af et join. Her beregner vi først antallet af ordrer pr. kunde og joiner det derefter tilbage til kundetabellen, så hver kunderække indeholder det samlede antal.
Bemærk, hvordan hovedforespørgslen næsten læses som almindeligt sprog: fra kunder, join deres ordreoptællinger.
WITH order_counts AS (
SELECT customer_id, COUNT(*) AS num_orders
FROM orders
GROUP BY customer_id
)
SELECT c.name, oc.num_orders
FROM customers c
JOIN order_counts oc
ON oc.customer_id = c.id;Hvor en CTE hører hjemme i forespørgslen
WITH-blokken skal komme før den sætning, der bruger den. CTE'en er kun synlig for den ene sætning, der følger umiddelbart efter definitionen.
- Du kan ikke referere til en CTE i en senere, separat forespørgsel.
- En CTE, der er defineret til en SELECT, kan ikke genbruges af en anden SELECT, der køres bagefter.
- Synlighedsområdet slutter ved det semikolon, der afslutter sætningen.
CTE'er fungerer med INSERT, UPDATE og DELETE
Et almindeligt opfølgende spørgsmål er, at CTE'er ikke er begrænset til SELECT. I de fleste moderne databaser kan du også knytte en WITH-klausul til sætninger, der ændrer data.
Det lader dig beregne et sæt rækker én gang og derefter udføre handlinger på dem, hvilket er langt tydeligere end en indlejret underforespørgsel i WHERE-klausulen.
WITH stale AS (
SELECT id
FROM sessions
WHERE last_seen < NOW() - INTERVAL '30 days'
)
DELETE FROM sessions
WHERE id IN (SELECT id FROM stale);Almindelige begynderfejl
Interviewere holder øje med disse fejl:
- At glemme hovedforespørgslen efter CTE'en; en
WITH-blok alene er ikke en komplet sætning. - At sætte et semikolon mellem CTE'en og hovedforespørgslen.
- At forvente, at CTE'en fortsætter mellem flere sætninger.
- At angive en valgfri liste med kolonnenavne, der ikke passer med kolonnerne i den indre forespørgsel.
Sådan taler du om CTE'er i et interview
Når du bliver bedt om at omstrukturere en rodet underforespørgsel, så fortæl, hvordan du tænker: Jeg løfter denne filtreringsforespørgsel ind i en CTE kaldet recent_orders, så aggregationen bliver let at læse.
At vise, at du vælger CTE'er for klarhed og genbrug og ikke blindt, signalerer modenhed på mellemniveau. Nævn, at en CTE ikke automatisk gør en forespørgsel hurtigere; dens primære værdi er læselighed.
Hurtig kontrol
Kontrollér din forståelse af grundlæggende CTE-syntaks og deres omfang.
Opsummering: Din første CTE
Du har lært, at en CTE bruger WITH name AS ( ... ) til at navngive et midlertidigt resultatsæt og derefter refererer til det som til en tabel i den efterfølgende forespørgsel.
- CTE'er forbedrer læselighed, genbrug og fejlfinding sammenlignet med indlejrede underforespørgsler.
- Omfanget er begrænset til én sætning; derefter forsvinder de.
- De fungerer med SELECT samt med INSERT/UPDATE/DELETE.
- De forbedrer ikke automatisk ydeevnen.
Næste trin: Kædning af flere CTE'er til en behandlingskæde.
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 “Skriv din første CTE” gratis?
Ja — hele teksten til “Skriv din første CTE” 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 “Skriv din første CTE”?
Grundlæggende WITH-syntaks, og hvornår en CTE giver bedre læsbarhed end en underforespørgsel 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 1 af 4.
Hvor lang tid tager lektionen “Skriv din første CTE”?
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
- Skriv din første CTE
- Sammenkædning af flere CTE'er
- CTE kontra underforespørgsel kontra midlertidig tabel
- Omlægning af indlejrede forespørgsler til CTE'er