SQL Academy · Lektion

Common Table Expressions (WITH)

Omskriv indlejrede forespørgsler til læsevenlige WITH-klausuler, kæd CTE'er sammen, og lær reglerne for materialisering i PostgreSQL 12+.

Lektion 3 af 412 trin

Common Table Expressions (WITH) er en gratis SQL Academy-lektion på CoddyKit. Dette er lektion 3 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 SQL Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. SQL Academy-kurset indeholder 4 lektioner i alt.

Hvad er en CTE?

Et Common Table Expression (CTE) er en navngivet underforespørgsel, der 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 bruge CTE'er?

Tre store fordele:

  • Læsbarhed — opdel en forespørgsel på 200 linjer i navngivne trin
  • Genbrug — referér til det samme mellemliggende resultat flere gange
  • Rekursion — kun CTE'er understøtter rekursive forespørgsler (i næste lektion)

Kædning af CTE'er

Definér flere CTE'er i én WITH, og brug en af dem i den næste:

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;

Genbrug af en CTE

Hvis det samme mellemliggende resultat bruges to gange, gør en CTE hensigten 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 af CTE'er (PostgreSQL ≤ 11)

Ældre PG-versioner materialiserede altid CTE-outputtet — en barriere for forespørgselsplanlæggeren. Fra PG 12 indsætter planlæggeren som standard CTE'er direkte i forespørgslen, medmindre du angiver andet:

-- Force the old materialise behaviour (rarely needed):
WITH x AS MATERIALIZED (SELECT ...) ...

-- Force inlining (default):
WITH x AS NOT MATERIALIZED (SELECT ...) ...

CTE'er, der ændrer data

CTE'er kan bruge INSERT/UPDATE/DELETE — praktisk til atomisk at flytte rækker mellem tabeller:

WITH moved AS (
  DELETE FROM orders WHERE status = 'archived' RETURNING *
)
INSERT INTO orders_archive SELECT * FROM moved;

CTE'er i DML

RETURNING + WITH til at finde og handle:

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;

Udførelsesrækkefølge

CTE'er, der ændrer data, køres uafhængigt i det samme øjebliksbillede. Hver sætning ser tilstanden FØR alle ændringer begynder — overraskende, men forudsigeligt.

CTE'er vs underforespørgsler vs visninger

Sammenligning:

  • Underforespørgsel — defineres direkte i forespørgslen og bruges én gang
  • CTE — navngivet, bruges flere gange i forespørgslen og forsvinder, når forespørgslen slutter
  • Visning — navngivet, gemmes og kan genbruges på tværs af forespørgsler

Overbrug ikke CTE'er

Hvis alt pakkes ind i en CTE, bliver forespørgslerne mere læsbare, men omkostningerne kan blive skjult. Ved meget store mellemliggende resultater kan planlæggeren vælge dårligere planer end for en tilsvarende JOIN.

Opsummering

CTE'er navngiver mellemliggende forespørgsler.

  • Forbedrer læsbarheden
  • Muliggør genbrug i én forespørgsel
  • Er nødvendige for rekursion
  • Indsættes som standard direkte i moderne PG

Hurtigt tjek

Hvilket nøgleord starter et Common Table Expression?

Gratis at komme i gang

Lær SQL 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
46
Lektioner
183

Ofte stillede spørgsmål

Er lektionen “Common Table Expressions (WITH)” gratis?

Ja — hele teksten til “Common Table Expressions (WITH)” 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 SQL Academy-kurset, skal du opgradere til CoddyKit PRO. SQL Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Common Table Expressions (WITH)”?

Omskriv indlejrede forespørgsler til læsevenlige WITH-klausuler, kæd CTE'er sammen, og lær reglerne for materialisering i PostgreSQL 12+. Du øver dig i SQL Academy 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å SQL Academy?

Der kræves ingen tidligere erfaring. SQL Academy 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 3 af 4.

Hvor lang tid tager lektionen “Common Table Expressions (WITH)”?

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 SQL Academy-lektion?

Ja. Alle SQL Academy-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

  1. Skalar-, række- og tabelunderforespørgsler
  2. Korrelerede kontra ikke-korrelerede underforespørgsler
  3. Common Table Expressions (WITH)
  4. Rekursive CTE'er til hierarkier
← Tilbage til SQL Academy