นิพจน์ตารางร่วม (WITH)
ปรับคำค้นซ้อนให้เป็นส่วนคำสั่ง WITH ที่อ่านง่าย ต่อ CTE หลายตัวเข้าด้วยกัน และเรียนรู้กฎการทำให้เป็นรูปธรรมใน PostgreSQL 12+
นิพจน์ตารางร่วม (WITH) เป็นบทเรียน SQL Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน SQL Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน
CTE คืออะไร
นิพจน์ตารางร่วม (CTE) คือซับคิวรีที่ตั้งชื่อไว้และกำหนดด้วย WITH:
WITH paid_orders AS (
SELECT * FROM orders WHERE status = 'paid'
)
SELECT user_id, COUNT(*)
FROM paid_orders
GROUP BY user_id;เหตุใดจึงใช้ CTE
ข้อดีสำคัญ 3 ประการ:
- อ่านง่าย — แบ่งคิวรี 200 บรรทัดออกเป็นขั้นตอนที่มีชื่อ
- นำกลับมาใช้ซ้ำ — อ้างอิงผลลัพธ์ระหว่างกลางเดียวกันได้หลายครั้ง
- การเรียกซ้ำ — มีเพียง CTE เท่านั้นที่รองรับคิวรีแบบเรียกซ้ำ (บทเรียนถัดไป)
การเชื่อม CTE
กำหนด CTE หลายรายการภายใน WITH เดียวกัน แล้วนำรายการหนึ่งไปใช้ในรายการถัดไป:
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;การนำ CTE กลับมาใช้ซ้ำ
หากใช้ผลลัพธ์ระหว่างกลางเดียวกันสองครั้ง CTE จะทำให้เจตนาของคิวรีชัดเจน:
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);การทำให้ CTE เป็นรูปธรรม (PostgreSQL ≤ 11)
เวอร์ชัน PG รุ่นเก่าจะทำให้ผลลัพธ์ของ CTE เป็นรูปธรรมเสมอ ซึ่งเป็นกำแพงกั้นผู้วางแผนคิวรี ตั้งแต่ PG 12 ผู้วางแผนจะแทรก CTE ลงในคิวรีโดยค่าเริ่มต้น เว้นแต่คุณจะระบุเป็นอย่างอื่น:
-- Force the old materialise behaviour (rarely needed):
WITH x AS MATERIALIZED (SELECT ...) ...
-- Force inlining (default):
WITH x AS NOT MATERIALIZED (SELECT ...) ...CTE ที่ปรับเปลี่ยนข้อมูล
CTE สามารถใช้ INSERT/UPDATE/DELETE ได้ เหมาะสำหรับการย้ายแถวระหว่างตารางแบบเป็นอะตอมิก:
WITH moved AS (
DELETE FROM orders WHERE status = 'archived' RETURNING *
)
INSERT INTO orders_archive SELECT * FROM moved;CTE ใน DML
ใช้ RETURNING + WITH สำหรับการ "ค้นหาและดำเนินการ":
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;ลำดับการทำงาน
CTE ที่ปรับเปลี่ยนข้อมูลทำงานอย่างเป็นอิสระภายในภาพสถานะเดียวกัน แต่ละคำสั่งจะเห็นสถานะ BEFORE — ก่อนที่การปรับเปลี่ยนทั้งหมดจะเริ่มต้น ซึ่งอาจดูน่าประหลาดใจ แต่คาดเดาได้
CTE เทียบกับซับคิวรีและมุมมอง
การเปรียบเทียบ:
- ซับคิวรี — กำหนดไว้ภายในคิวรี ใช้ครั้งเดียว
- CTE — มีชื่อ ใช้ได้หลายครั้งภายในคิวรี และหายไปเมื่อคิวรีจบลง
- มุมมอง — มีชื่อ บันทึกคงอยู่ และนำกลับมาใช้ซ้ำได้ในหลายคิวรี
อย่าใช้ CTE มากเกินไป
การห่อทุกอย่างด้วย CTE ทำให้คิวรีอ่านง่าย แต่ก็อาจซ่อนต้นทุนไว้ได้ เมื่อผลลัพธ์ระหว่างกลางมีขนาดใหญ่มาก ผู้วางแผนอาจเลือกแผนที่แย่กว่าคิวรี JOIN ที่ให้ผลเทียบเท่ากัน
สรุป
CTE ใช้ตั้งชื่อคิวรีระหว่างกลาง
- ช่วยให้อ่านง่ายขึ้น
- ทำให้นำกลับมาใช้ซ้ำได้ภายในคิวรีเดียว
- จำเป็นสำหรับการเรียกซ้ำ
- ระบบจะแทรกลงในคิวรีโดยค่าเริ่มต้นใน PG รุ่นใหม่
ตรวจสอบความเข้าใจ
คำสำคัญใดใช้เริ่มนิพจน์ตารางร่วม
คำถามที่พบบ่อย
บทเรียน “นิพจน์ตารางร่วม (WITH)” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “นิพจน์ตารางร่วม (WITH)” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส SQL Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “นิพจน์ตารางร่วม (WITH)”
ปรับคำค้นซ้อนให้เป็นส่วนคำสั่ง WITH ที่อ่านง่าย ต่อ CTE หลายตัวเข้าด้วยกัน และเรียนรู้กฎการทำให้เป็นรูปธรรมใน PostgreSQL 12+ คุณปฏิบัติ SQL Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน SQL Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน SQL Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “นิพจน์ตารางร่วม (WITH)” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน SQL Academy นี้ได้ไหม
ได้ บทเรียน SQL Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- คำค้นย่อยแบบสเกลาร์ แถว และตาราง
- คำค้นย่อยแบบสัมพันธ์กับแบบไม่สัมพันธ์
- นิพจน์ตารางร่วม (WITH)
- CTE แบบเวียนเกิดสำหรับลำดับชั้น