Ungkapan Jadual Biasa (WITH)
Susun semula pertanyaan bersarang menjadi klausa WITH yang mudah dibaca, rangkaikan CTE dan pelajari peraturan pematerian dalam PostgreSQL 12+.
Ungkapan Jadual Biasa (WITH) ialah pelajaran SQL Academy percuma di CoddyKit. Ini ialah pelajaran 3 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran SQL Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus SQL Academy merangkumi sejumlah 4 pelajaran.
Apakah CTE
Ungkapan Jadual Biasa (CTE) ialah subpertanyaan bernama yang ditakrifkan dengan WITH:
WITH paid_orders AS (
SELECT * FROM orders WHERE status = 'paid'
)
SELECT user_id, COUNT(*)
FROM paid_orders
GROUP BY user_id;Mengapakah Menggunakan CTE
Tiga manfaat utama:
- Kebolehbacaan — pecahkan pertanyaan 200 baris kepada langkah-langkah bernama
- Penggunaan Semula — rujuk hasil perantaraan yang sama beberapa kali
- Rekursi — hanya CTE menyokong pertanyaan rekursif (dalam pelajaran seterusnya)
Merangkaikan CTE
Takrifkan banyak CTE dalam satu WITH dan gunakan satu CTE dalam CTE seterusnya:
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 Semula CTE
Jika hasil perantaraan yang sama digunakan dua kali, CTE menjadikan maksudnya 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);Pematerialan CTE (PostgreSQL ≤ 11)
Versi PG yang lebih lama sentiasa mematerialkan hasil CTE — iaitu sebagai penghalang kepada perancang. Mulai PG 12, perancang secara lalai mengembangkan CTE ke dalam pertanyaan, melainkan anda menyatakan 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 boleh menggunakan INSERT/UPDATE/DELETE — berguna untuk memindahkan baris antara jadual 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 "mencari 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 Pelaksanaan
CTE yang mengubah data berjalan secara bebas dalam petikan keadaan yang sama. Setiap pernyataan melihat keadaan SEBELUM semua pengubahsuaian bermula — mengejutkan tetapi boleh dijangka.
CTE berbanding Subpertanyaan berbanding Paparan
Perbandingan:
- Subpertanyaan — ditakrifkan sebaris; digunakan sekali
- CTE — bernama; digunakan beberapa kali dalam pertanyaan; hilang selepas pertanyaan tamat
- Paparan — bernama; disimpan; boleh digunakan semula merentas pertanyaan
Jangan Gunakan CTE secara Berlebihan
Membungkus segala-galanya dalam CTE menjadikan pertanyaan lebih mudah dibaca tetapi boleh menyembunyikan kosnya. Dengan hasil perantaraan yang sangat besar, perancang mungkin memilih pelan yang lebih buruk berbanding JOIN yang setara.
Imbas Kembali
CTE memberikan nama kepada pertanyaan perantaraan.
- Meningkatkan kebolehbacaan
- Membolehkan penggunaan semula dalam satu pertanyaan
- Diperlukan untuk rekursi
- Dikembangkan ke dalam pertanyaan secara lalai dalam PG moden
Semakan Pantas
Kata kunci apakah yang memulakan Ungkapan Jadual Biasa?
Pelajari SQL dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 46
- Pelajaran
- 183
Soalan Lazim
Adakah pelajaran “Ungkapan Jadual Biasa (WITH)” percuma?
Ya — teks penuh “Ungkapan Jadual Biasa (WITH)” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus SQL Academy, tingkat taraf kepada CoddyKit PRO. Kursus SQL Academy merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “Ungkapan Jadual Biasa (WITH)”?
Susun semula pertanyaan bersarang menjadi klausa WITH yang mudah dibaca, rangkaikan CTE dan pelajari peraturan pematerian dalam PostgreSQL 12+. Anda berlatih SQL Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan SQL Academy?
Tiada pengalaman terdahulu diperlukan. Pembelajaran SQL Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 3 daripada 4.
Berapa lamakah pelajaran “Ungkapan Jadual Biasa (WITH)” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran SQL Academy ini?
Ya. Setiap pelajaran SQL Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- Subpertanyaan Skalar, Baris dan Jadual
- Subpertanyaan Berkorelasi berbanding Tidak Berkorelasi
- Ungkapan Jadual Biasa (WITH)
- CTE Rekursif untuk Hierarki