0Pricing
SQL Academy · บทเรียน

นิพจน์ตารางร่วม (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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. คำค้นย่อยแบบสเกลาร์ แถว และตาราง
  2. คำค้นย่อยแบบสัมพันธ์กับแบบไม่สัมพันธ์
  3. นิพจน์ตารางร่วม (WITH)
  4. CTE แบบเวียนเกิดสำหรับลำดับชั้น
← กลับไปที่ SQL Academy