Ekspresi Tabel Umum (WITH)
Ubah kueri bertingkat menjadi klausa WITH yang mudah dibaca, rangkai CTE, dan pelajari aturan materialisasi di PostgreSQL 12+.
Ekspresi Tabel Umum (WITH) adalah pelajaran SQL Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar SQL Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus SQL Academy mencakup 4 pelajaran total.
Apa Itu CTE?
Ekspresi Tabel Umum (CTE) adalah subkueri bernama yang ditentukan dengan WITH:
WITH paid_orders AS (
SELECT * FROM orders WHERE status = 'paid'
)
SELECT user_id, COUNT(*)
FROM paid_orders
GROUP BY user_id;Mengapa Menggunakan CTE?
Tiga manfaat utama:
- Keterbacaan — memecah kueri 200 baris menjadi langkah-langkah bernama
- Pemakaian ulang — merujuk hasil perantara yang sama beberapa kali
- Rekursi — hanya CTE yang mendukung kueri rekursif (pada pelajaran berikutnya)
Merangkai CTE
Tentukan banyak CTE dalam satu WITH dan gunakan salah satunya pada CTE berikutnya:
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;Menggunakan Kembali CTE
Jika perantara yang sama digunakan dua kali, CTE membuat maksud kueri menjadi jelas:
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);Materialisasi CTE (PostgreSQL ≤ 11)
Versi PG yang lebih lama selalu mematerialisasi keluaran CTE — menjadi penghalang bagi perencana. Mulai PG 12, perencana menyisipkan CTE secara bawaan, kecuali Anda menentukan sebaliknya:
-- Force the old materialise behaviour (rarely needed):
WITH x AS MATERIALIZED (SELECT ...) ...
-- Force inlining (default):
WITH x AS NOT MATERIALIZED (SELECT ...) ...CTE yang Mengubah Data
CTE dapat menggunakan INSERT/UPDATE/DELETE — berguna untuk memindahkan baris antar tabel secara atomik:
WITH moved AS (
DELETE FROM orders WHERE status = 'archived' RETURNING *
)
INSERT INTO orders_archive SELECT * FROM moved;CTE dalam DML
RETURNING + WITH untuk "menemukan dan bertindak":
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;Urutan Eksekusi
CTE yang mengubah data berjalan secara independen dalam snapshot yang sama. Setiap pernyataan melihat keadaan SEBELUM semua perubahan dimulai — mengejutkan, tetapi dapat diprediksi.
CTE vs Subkueri vs Tampilan
Perbandingan:
- Subkueri — ditentukan langsung di dalam kueri; digunakan satu kali
- CTE — memiliki nama; digunakan beberapa kali dalam kueri; hilang setelah kueri berakhir
- Tampilan — memiliki nama; tersimpan; dapat digunakan kembali di berbagai kueri
Jangan Berlebihan Menggunakan CTE
Membungkus segala sesuatu dalam CTE membuat kueri mudah dibaca, tetapi dapat menyamarkan biayanya. Dengan hasil perantara yang sangat besar, perencana mungkin memilih rencana yang lebih buruk daripada untuk JOIN yang setara.
Ringkasan
CTE memberi nama pada kueri perantara.
- Meningkatkan keterbacaan
- Memungkinkan pemakaian ulang dalam satu kueri
- Diperlukan untuk rekursi
- Secara bawaan disisipkan pada PG modern
Pemeriksaan Singkat
Kata kunci apa yang mengawali Ekspresi Tabel Umum?
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Ekspresi Tabel Umum (WITH)” gratis?
Ya — teks lengkap “Ekspresi Tabel Umum (WITH)” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus SQL Academy, upgrade ke CoddyKit PRO. Kursus SQL Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Ekspresi Tabel Umum (WITH)”?
Ubah kueri bertingkat menjadi klausa WITH yang mudah dibaca, rangkai CTE, dan pelajari aturan materialisasi di PostgreSQL 12+. Kamu berlatih SQL Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai SQL Academy?
Tidak diperlukan pengalaman sebelumnya. SQL Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.
Berapa lama pelajaran “Ekspresi Tabel Umum (WITH)” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran SQL Academy ini?
Ya. Setiap pelajaran SQL Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Subkueri Skalar, Baris, dan Tabel
- Subkueri Berkorelasi vs Tidak Berkorelasi
- Ekspresi Tabel Umum (WITH)
- CTE RECURSIVE untuk Hierarki