0Pricing
SQL Academy · Lekcja

Wspólne wyrażenia tabelowe (WITH)

Porządkuj zagnieżdżone zapytania za pomocą czytelnych klauzul WITH, łącz CTE i poznaj zasady materializacji w PostgreSQL 12+.

Wspólne wyrażenia tabelowe (WITH) to bezpłatna lekcja SQL Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej SQL Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs SQL Academy zawiera 4 lekcji w sumie.

Czym jest CTE?

Common Table Expression (CTE) to nazwane podzapytanie zdefiniowane za pomocą WITH:

WITH paid_orders AS (
  SELECT * FROM orders WHERE status = 'paid'
)
SELECT user_id, COUNT(*)
FROM paid_orders
GROUP BY user_id;

Dlaczego warto używać CTE?

Trzy najważniejsze korzyści:

  • Czytelność — podział 200-wierszowego zapytania na nazwane kroki
  • Ponowne użycie — odwoływanie się do tego samego wyniku pośredniego wiele razy
  • Rekurencja — tylko CTE obsługują zapytania rekurencyjne (w następnej lekcji)

Łączenie CTE

Można zdefiniować wiele CTE w jednym WITH i używać jednego w kolejnym:

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;

Ponowne używanie CTE

Jeśli ten sam wynik pośredni jest używany dwa razy, CTE jasno pokazuje intencję:

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);

Materializacja CTE (PostgreSQL ≤ 11)

Starsze wersje PG zawsze materializowały wynik CTE — stanowiło to barierę dla planera. Od PG 12 planer domyślnie rozwija CTE, chyba że określą Państwo inne zachowanie:

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

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

CTE modyfikujące dane

CTE mogą używać INSERT/UPDATE/DELETE — jest to przydatne do atomowego przenoszenia wierszy między tabelami:

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

CTE w DML

RETURNING + WITH do operacji „znajdź i wykonaj działanie”:

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;

Kolejność wykonywania

CTE modyfikujące dane są wykonywane niezależnie w ramach tego samego migawkowego obrazu danych. Każda instrukcja widzi stan SPRZED rozpoczęcia wszystkich modyfikacji — może to zaskakiwać, ale zachowanie jest przewidywalne.

CTE a podzapytania i widoki

Porównanie:

  • Podzapytanie — zdefiniowane bezpośrednio w zapytaniu; używane jednokrotnie
  • CTE — nazwane; używane wielokrotnie w ramach zapytania; usuwane po zakończeniu zapytania
  • Widok — nazwany; trwały; możliwy do ponownego użycia w wielu zapytaniach

Nie należy nadużywać CTE

Umieszczanie wszystkiego w CTE zwiększa czytelność zapytań, ale może ukrywać ich koszt. W przypadku bardzo dużych wyników pośrednich planer może wybrać gorsze plany niż dla równoważnego JOIN.

Podsumowanie

CTE nadają nazwy zapytaniom pośrednim.

  • Poprawiają czytelność
  • Umożliwiają ponowne użycie w jednym zapytaniu
  • Są wymagane do rekurencji
  • W nowoczesnym PG są domyślnie rozwijane

Szybkie sprawdzenie

Jakie słowo kluczowe rozpoczyna Common Table Expression?

Często zadawane pytania

Czy lekcja „Wspólne wyrażenia tabelowe (WITH)” jest bezpłatna?

Tak — pełny tekst „Wspólne wyrażenia tabelowe (WITH)” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu SQL Academy, przejdź na CoddyKit PRO. Kurs SQL Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Wspólne wyrażenia tabelowe (WITH)”?

Porządkuj zagnieżdżone zapytania za pomocą czytelnych klauzul WITH, łącz CTE i poznaj zasady materializacji w PostgreSQL 12+. Ćwiczysz SQL Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć SQL Academy?

Nie wymagamy żadnego doświadczenia. SQL Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.

Ile czasu zajmuje lekcja „Wspólne wyrażenia tabelowe (WITH)”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji SQL Academy?

Tak. Każda lekcja SQL Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Podzapytania skalarne, wierszowe i tabelowe
  2. Podzapytania skorelowane i nieskorelowane
  3. Wspólne wyrażenia tabelowe (WITH)
  4. Rekurencyjne CTE dla hierarchii
← Powrót do SQL Academy