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
- Podzapytania skalarne, wierszowe i tabelowe
- Podzapytania skorelowane i nieskorelowane
- Wspólne wyrażenia tabelowe (WITH)
- Rekurencyjne CTE dla hierarchii