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

การสร้างชุดและลำดับ

สร้างแถวด้วยการเรียกซ้ำ

การสร้างชุดและลำดับ เป็นบทเรียน SQL Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน SQL Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน

ชุดค่าต่อเนื่องที่สร้างขึ้นคืออะไร

บางครั้งคุณต้องการรายการตัวเลข วันที่ หรือค่าต่อเนื่องอื่น ๆ ที่ไม่มีอยู่ในตารางใดเลย ภาษาสอบถามฐานข้อมูลช่วยให้คุณสร้างค่าเหล่านี้ได้ทันทีโดยใช้การเรียกซ้ำหรือฟังก์ชันในตัว

ในบทเรียนนี้ คุณจะได้เรียนรู้วิธีสร้างลำดับด้วย WITH RECURSIVE ซึ่งเป็นเครื่องมือทรงพลังที่ทำให้คำสั่งสอบถามอ้างอิงผลลัพธ์ของตัวเองได้

CTE แบบเรียกซ้ำแรกของคุณ

CTE แบบเรียกซ้ำ (นิพจน์ตารางร่วม) มีสองส่วนที่เชื่อมกันด้วย UNION ALL: กรณีฐานที่สร้างแถวแรก และขั้นตอนแบบเรียกซ้ำที่อ้างอิง CTE เองเพื่อสร้างแถวถัดไป

การเรียกซ้ำจะหยุดเมื่อขั้นตอนแบบเรียกซ้ำไม่ส่งคืนแถวใดเลย

WITH RECURSIVE counter(n) AS (
  SELECT 1
  UNION ALL
  SELECT n + 1 FROM counter WHERE n < 5
)
SELECT n FROM counter;

การทำงานของการเรียกซ้ำทีละขั้น

การพิจารณาแต่ละขั้นแยกกันช่วยให้เข้าใจได้ง่าย กรณีฐานจะเริ่มต้นตาราง จากนั้นแต่ละรอบการเรียกซ้ำจะเพิ่มอีกหนึ่งแถวจนกว่าเงื่อนไข WHERE จะไม่เป็นจริง

สำหรับคำสั่งสอบถามที่มี WHERE n < 5 ระบบประมวลผลจะสร้างแถว 1, 2, 3, 4, 5 แล้วหยุด เพราะ 5 < 5 เป็นเท็จ

WITH RECURSIVE steps(n, note) AS (
  SELECT 1, 'base case'
  UNION ALL
  SELECT n + 1, 'recursive step'
  FROM steps
  WHERE n < 4
)
SELECT n, note FROM steps;

การสร้างเลขคู่

คุณสามารถเปลี่ยนขนาดขั้นได้ง่าย ๆ ด้วยการเพิ่มค่ามากกว่า 1 ในส่วนแบบเรียกซ้ำ วิธีนี้จะสร้างเลขคู่ทุกจำนวนตั้งแต่ 2 ถึง 10

รูปแบบจะเป็นดังนี้เสมอ: ค่าถัดไป = ค่าปัจจุบัน + ขั้น

WITH RECURSIVE evens(n) AS (
  SELECT 2
  UNION ALL
  SELECT n + 2 FROM evens WHERE n < 10
)
SELECT n FROM evens;

การนับถอยหลัง

การเรียกซ้ำไม่ได้จำกัดอยู่แค่การนับขึ้นเท่านั้น ให้ลบแทนการบวก แล้วคุณจะได้ลำดับจากมากไปน้อย ตรวจสอบให้แน่ใจว่าเงื่อนไขหยุดใช้ > แทน < เพื่อหลีกเลี่ยงวงวนไม่สิ้นสุด

WITH RECURSIVE countdown(n) AS (
  SELECT 10
  UNION ALL
  SELECT n - 1 FROM countdown WHERE n > 1
)
SELECT n FROM countdown;

การสร้างช่วงวันที่

การใช้งาน CTE แบบเรียกซ้ำที่เป็นประโยชน์อย่างมากอย่างหนึ่งคือการสร้าง ชุดวันที่ คุณเริ่มจากวันที่ที่ระบุ แล้วเพิ่มทีละหนึ่งวันไปเรื่อย ๆ จนถึงวันที่สิ้นสุด

วิธีนี้มีประโยชน์อย่างยิ่งสำหรับเติมช่องว่างในรายงาน เพราะจะแสดงทุกวันแม้ไม่มีข้อมูลของวันนั้น

WITH RECURSIVE dates(d) AS (
  SELECT DATE '2024-01-01'
  UNION ALL
  SELECT d + INTERVAL '1 day'
  FROM dates
  WHERE d < DATE '2024-01-07'
)
SELECT d FROM dates;

เติมช่องว่างในรายงานด้วยชุดวันที่

ลองนึกภาพตาราง sales ที่มีแถวเฉพาะวันที่มียอดขาย เมื่อนำชุดวันที่ที่สร้างขึ้นมาเชื่อมกับตารางยอดขายด้วย LEFT JOIN คุณจะได้ทุกวันในช่วงที่กำหนด โดยมีค่า NULL สำหรับวันที่ไม่มียอดขาย

WITH RECURSIVE cal(d) AS (
  SELECT DATE '2024-03-01'
  UNION ALL
  SELECT d + INTERVAL '1 day' FROM cal WHERE d < DATE '2024-03-05'
),
sales(sale_date, amount) AS (
  VALUES
    (DATE '2024-03-01', 100),
    (DATE '2024-03-03', 250),
    (DATE '2024-03-05', 180)
)
SELECT cal.d, COALESCE(sales.amount, 0) AS amount
FROM cal
LEFT JOIN sales ON cal.d = sales.sale_date
ORDER BY cal.d;

การสร้างตารางสูตรคูณ

CTE แบบเรียกซ้ำสามารถเก็บหลายคอลัมน์ได้ ทำให้คุณสร้างผลลัพธ์ที่มีรายละเอียดมากขึ้นได้ ในที่นี้มีการติดตามทั้งดัชนีแถวและค่าที่คำนวณได้ในเวลาเดียวกัน

WITH RECURSIVE mult(n, result) AS (
  SELECT 1, 1 * 7
  UNION ALL
  SELECT n + 1, (n + 1) * 7
  FROM mult
  WHERE n < 10
)
SELECT n, result AS seven_times_n FROM mult;

ตัวเลขฟีโบนัชชี

ฟีโบนัชชีเป็นลำดับคลาสสิกที่ตัวเลขแต่ละตัวคือผลรวมของสองตัวก่อนหน้า: 0, 1, 1, 2, 3, 5, 8 …

CTE แบบเรียกซ้ำจะติดตามทั้งค่าปัจจุบัน a และค่าถัดไป b แล้วสลับค่าทั้งสองในแต่ละขั้น

WITH RECURSIVE fib(a, b) AS (
  SELECT 0, 1
  UNION ALL
  SELECT b, a + b FROM fib WHERE a < 100
)
SELECT a AS fibonacci FROM fib;

การใช้ generate_series ใน PostgreSQL

PostgreSQL มีทางลัดในตัวชื่อ generate_series() ซึ่งสร้างลำดับได้โดยไม่ต้องเขียน CTE แบบเรียกซ้ำ ฟังก์ชันนี้รับจุดเริ่มต้น จุดสิ้นสุด และขั้นซึ่งเป็นตัวเลือกเสริม

นี่เป็นวิธีที่กระชับที่สุดในการสร้างช่วงตัวเลขหรือช่วงวันที่ใน PostgreSQL

SELECT gs AS num
FROM generate_series(1, 10, 2) AS gs;

การสร้างช่วงเวลารายเดือน

ส่งช่วงเวลา '1 month' ให้กับ generate_series() เพื่อสร้างปฏิทินรายเดือน วิธีนี้เหมาะอย่างยิ่งสำหรับสร้างหัวรายงานรายเดือนหรือตรวจสอบว่าเดือนไหนไม่มีข้อมูล

SELECT gs::DATE AS month_start
FROM generate_series(
  '2024-01-01'::DATE,
  '2024-06-01'::DATE,
  INTERVAL '1 month'
) AS gs;

ตรวจสอบความรู้

ทดสอบความเข้าใจของคุณเกี่ยวกับการสร้างชุดค่าต่อเนื่องด้วย CTE แบบเรียกซ้ำ

ทบทวน: การสร้างชุดค่าต่อเนื่องและลำดับ

ในบทเรียนนี้ คุณได้เรียนรู้วิธีสร้างลำดับตัวเลขและวันที่โดยไม่ต้องมีตารางต้นทาง:

  • WITH RECURSIVE — กรณีฐานบวกขั้นตอนแบบเรียกซ้ำที่เชื่อมด้วย UNION ALL และหยุดเมื่อขั้นตอนแบบเรียกซ้ำไม่ส่งคืนแถวใดเลย
  • ขนาดขั้นที่ยืดหยุ่น — บวกหรือลบค่าใดก็ได้เพื่อการนับขึ้น การนับลง หรือการข้ามค่า
  • ช่วงวันที่ — เพิ่มช่วงเวลาเพื่อสร้างชุดปฏิทินรายวัน รายเดือน หรือแบบกำหนดเอง
  • CTE หลายคอลัมน์ — เก็บสถานะเพิ่มเติมข้ามการวนซ้ำเพื่อสร้างผลลัพธ์ที่มีรายละเอียดมากขึ้น เช่น ฟีโบนัชชี
  • generate_series() — ฟังก์ชันในตัวของ PostgreSQL สำหรับสร้างลำดับตัวเลขและวันที่ได้อย่างกระชับที่สุด

ชุดค่าต่อเนื่องที่สร้างขึ้นมีความสำคัญต่อการเติมช่องว่างในรายงาน การสร้างข้อมูลทดสอบ และทุกกรณีที่ต้องการช่วงค่าครบถ้วนโดยไม่ขึ้นอยู่กับข้อมูลที่มีอยู่

คำถามที่พบบ่อย

บทเรียน “การสร้างชุดและลำดับ” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การสร้างชุดและลำดับ” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส SQL Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การสร้างชุดและลำดับ”

สร้างแถวด้วยการเรียกซ้ำ คุณปฏิบัติ SQL Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน SQL Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน SQL Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน

บทเรียน “การสร้างชุดและลำดับ” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน SQL Academy นี้ได้ไหม

ได้ บทเรียน SQL Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

  1. การทำงานของ CTE แบบเรียกซ้ำ
  2. การเดินผ่านต้นไม้หมวดหมู่
  3. การสร้างชุดและลำดับ
  4. การหลีกเลี่ยงลูปไม่รู้จบ
← กลับไปที่ SQL Academy