Felles tabelluttrykk (WITH)
Omstrukturer nestede spørringer til lesbare WITH-ledd, kjed sammen CTE-er, og lær reglene for materialisering i PostgreSQL 12+.
Felles tabelluttrykk (WITH) er en gratis leksjon i SQL Academy på CoddyKit. Dette er leksjon 3 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 SQL Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i SQL Academy inneholder totalt 4 leksjoner.
Hva er en CTE?
En Common Table Expression (CTE) er en navngitt underforespørsel som defineres med WITH:
WITH paid_orders AS (
SELECT * FROM orders WHERE status = 'paid'
)
SELECT user_id, COUNT(*)
FROM paid_orders
GROUP BY user_id;Hvorfor bruke CTE-er?
Tre store fordeler:
- Lesbarhet — del opp en spørring på 200 linjer i navngitte trinn
- Gjenbruk — referer til det samme mellomresultatet flere ganger
- Rekursjon — bare CTE-er støtter rekursive spørringer (i neste leksjon)
Kjeding av CTE-er
Definer flere CTE-er i én WITH, og bruk én i den neste:
WITH last_30 AS (
SELECT * FROM orders WHERE created_at >= NOW() - INTERVAL '30 days'
),
per_user AS (
SELECT user_id, SUM(total) AS revenue FROM last_30 GROUP BY user_id
)
SELECT u.email, p.revenue
FROM users u
JOIN per_user p ON p.user_id = u.id
ORDER BY p.revenue DESC LIMIT 20;Gjenbruk av en CTE
Hvis det samme mellomresultatet brukes to ganger, gjør en CTE hensikten tydelig:
WITH recent_users AS (
SELECT id FROM users WHERE created_at >= NOW() - INTERVAL '7 days'
)
SELECT 'new orders' AS metric, COUNT(*) FROM orders
WHERE user_id IN (SELECT id FROM recent_users)
UNION ALL
SELECT 'new revenue', SUM(total) FROM orders
WHERE user_id IN (SELECT id FROM recent_users);Materialisering av CTE-er (PostgreSQL ≤ 11)
Eldre PG-versjoner materialiserte alltid CTE-resultatet — en barriere for spørringsplanleggeren. Fra og med PG 12 bygger planleggeren som standard CTE-er inn i spørringen, med mindre De angir noe annet:
-- Force the old materialise behaviour (rarely needed):
WITH x AS MATERIALIZED (SELECT ...) ...
-- Force inlining (default):
WITH x AS NOT MATERIALIZED (SELECT ...) ...CTE-er som endrer data
CTE-er kan bruke INSERT/UPDATE/DELETE — praktisk for å flytte rader mellom tabeller atomisk:
WITH moved AS (
DELETE FROM orders WHERE status = 'archived' RETURNING *
)
INSERT INTO orders_archive SELECT * FROM moved;CTE-er i DML
RETURNING + WITH for å «finne og utføre en handling»:
WITH cancelled AS (
UPDATE orders SET status = 'cancelled'
WHERE created_at < NOW() - INTERVAL '14 days'
AND status = 'pending'
RETURNING id
)
INSERT INTO audit_log (event, order_id)
SELECT 'auto-cancel', id FROM cancelled;Utførelsesrekkefølge
CTE-er som endrer data, kjører uavhengig i samme øyeblikksbilde. Hver spørring ser tilstanden FØR alle endringene starter — overraskende, men forutsigbart.
CTE-er kontra underforespørsler og visninger
Sammenligning:
- Underforespørsel — defineres direkte i spørringen og brukes én gang
- CTE — navngitt, brukes flere ganger i spørringen og forsvinner når spørringen er ferdig
- Visning — navngitt, lagres og kan gjenbrukes på tvers av spørringer
Ikke overbruk CTE-er
Det å pakke alt inn i en CTE gjør spørringer mer lesbare, men kan skjule kostnadene. Med svært store mellomresultater kan planleggeren velge dårligere planer enn for en tilsvarende JOIN.
Oppsummering
CTE-er gir navn til mellomliggende spørringer.
- Forbedrer lesbarheten
- Muliggjør gjenbruk i én spørring
- Kreves for rekursjon
- Bygges som standard inn i spørringen i moderne PG
Hurtigsjekk
Hvilket nøkkelord starter en Common Table Expression?
Lær deg SQL 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
- 46
- Leksjoner
- 183
Ofte stilte spørsmål
Er leksjonen «Felles tabelluttrykk (WITH)» gratis?
Ja – hele teksten i «Felles tabelluttrykk (WITH)» 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 SQL Academy-kurset, kan du oppgradere til CoddyKit PRO. Kurset i SQL Academy inneholder totalt 4 leksjoner.
Hva lærer jeg i «Felles tabelluttrykk (WITH)»?
Omstrukturer nestede spørringer til lesbare WITH-ledd, kjed sammen CTE-er, og lær reglene for materialisering i PostgreSQL 12+. Du øver på SQL Academy 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 SQL Academy?
Ingen tidligere erfaring er nødvendig. SQL Academy 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 3 av 4.
Hvor lang tid tar leksjonen «Felles tabelluttrykk (WITH)»?
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 SQL Academy-leksjonen?
Ja. Alle SQL Academy-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
- Skalar-, rad- og tabellunderspørringer
- Korrelaterte kontra ikke-korrelaterte underspørringer
- Felles tabelluttrykk (WITH)
- Rekursive CTE-er for hierarkier