การสร้างชุดและลำดับ
สร้างแถวด้วยการเรียกซ้ำ
การสร้างชุดและลำดับ เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การทำงานของ CTE แบบเรียกซ้ำ
- การเดินผ่านต้นไม้หมวดหมู่
- การสร้างชุดและลำดับ
- การหลีกเลี่ยงลูปไม่รู้จบ