LIMIT และ OFFSET
ดึงข้อมูล N แถวแรกและแบ่งหน้า
LIMIT และ OFFSET เป็นบทเรียน SQL Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน SQL Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน
ดึงข้อมูลเพียงไม่กี่แถว
บางครั้งคุณไม่ต้องการแถวที่ตรงเงื่อนไขทั้งหมด แต่อาจต้องการเพียงไม่กี่แถวแรก LIMIT ใช้จำกัดจำนวนแถวที่คำสั่งค้นหาจะคืนค่า
คำสั่งนี้คืนค่าผลิตภัณฑ์ไม่เกิน 5 รายการ
SELECT name, price
FROM products
LIMIT 5;LIMIT ที่ไม่มี ORDER BY ให้ผลแบบสุ่ม
การใช้ LIMIT เพียงอย่างเดียวจะคืนค่าแถว บางส่วน แต่ไม่กำหนดว่า แถวใดจะถูกคืนค่า ควรใช้คู่กับ ORDER BY เสมอ เพื่อให้ผลลัพธ์มีความหมายและได้ผลซ้ำเดิม
-- The 5 newest orders, deterministically
SELECT id, total, created_at
FROM orders
ORDER BY created_at DESC
LIMIT 5;ข้ามแถวด้วย OFFSET
OFFSET บอกให้ฐานข้อมูล ข้ามแถวตามจำนวนที่กำหนดก่อนส่งค่ากลับมา เมื่อใช้ร่วมกับ LIMIT จะเป็นพื้นฐานของการแบ่งหน้า
คำสั่งนี้ข้าม 10 แถวแรกและคืนค่า 5 แถวถัดไป
SELECT name, price
FROM products
ORDER BY name
LIMIT 5 OFFSET 10;การสร้างหน้า
สำหรับขนาดหน้าเท่ากับ 10 หมายเลขหน้าจะสอดคล้องกับออฟเซ็ตดังนี้:
- หน้า 1:
OFFSET 0 - หน้า 2:
OFFSET 10 - หน้า 3:
OFFSET 20
สูตรคือ OFFSET = (page - 1) * page_size
-- Page 3 with 10 rows per page
SELECT name, price
FROM products
ORDER BY name
LIMIT 10 OFFSET 20;ลำดับการทำงาน
ฐานข้อมูลจะใช้ส่วนคำสั่งตามลำดับนี้: กรองด้วย WHERE เรียงด้วย ORDER BY แล้วตัดด้วย OFFSET และ LIMIT
ดังนั้นคุณจะแบ่งหน้าผ่านผลลัพธ์ที่ เรียงและกรองแล้วเสมอ
SELECT name, price
FROM products
WHERE price > 0
ORDER BY price DESC
LIMIT 10 OFFSET 0;LIMIT ALL และ OFFSET 0
LIMIT ALL หมายถึง “ไม่จำกัดจำนวน” (เช่นเดียวกับการไม่ระบุ LIMIT) ส่วน OFFSET 0 หมายถึงไม่ข้ามแถวใดเลย ทั้งสองรูปแบบมีประโยชน์เป็นครั้งคราวเมื่อสร้างค่าขึ้นแบบไดนามิก
SELECT name
FROM products
ORDER BY name
LIMIT ALL OFFSET 0;ไวยากรณ์ FETCH มาตรฐาน
PostgreSQL รองรับรูปแบบตามมาตรฐาน SQL ด้วย: OFFSET n ROWS FETCH NEXT m ROWS ONLY ซึ่งทำงานเหมือนกับ LIMIT/OFFSET ทุกประการ เพียงเขียนยาวกว่า
SELECT name, price
FROM products
ORDER BY name
OFFSET 10 ROWS
FETCH NEXT 5 ROWS ONLY;เหตุใด OFFSET ขนาดใหญ่จึงช้า
OFFSET ขนาดใหญ่ยังทำให้ฐานข้อมูลต้องสแกนและทิ้งทุกแถวที่ถูกข้าม OFFSET 100000 จะอ่าน 100,000 แถวเพียงเพื่อทิ้งไป จึงทำงานช้าลงเมื่ออยู่ในหน้าที่ลึกมาก
-- Reads 100000 rows then discards them
SELECT id, name
FROM products
ORDER BY id
LIMIT 10 OFFSET 100000;การแบ่งหน้าแบบใช้คีย์
ทางเลือกที่เร็วกว่า คือการแบ่งหน้าแบบใช้คีย์ (แบบค้นหา) แทนการใช้ค่าออฟเซต ให้จำแถวสุดท้ายที่เห็น แล้วขอแถวที่อยู่ถัดจากแถวนั้น
วิธีนี้ใช้ดัชนีเพื่อข้ามไปยังหน้าถัดไปโดยตรง โดยไม่ต้องข้ามแถว
-- Next page after the last seen id (e.g. 5000)
SELECT id, name
FROM products
WHERE id > 5000
ORDER BY id
LIMIT 10;หน้าที่คงที่ต้องใช้การเรียงลำดับที่คงที่
หาก ORDER BY ของคุณมีค่าที่เสมอกัน แถวอาจสลับตำแหน่งระหว่างการโหลดแต่ละหน้า ทำให้เห็นแถวซ้ำหรือแถวขาดหายได้ ควรปิดท้ายการเรียงลำดับด้วยคีย์ที่ไม่ซ้ำกัน เช่น คีย์หลัก เพื่อให้การแบ่งหน้าสม่ำเสมอ
SELECT id, name, price
FROM products
ORDER BY price DESC, id
LIMIT 10 OFFSET 20;แถวอันดับหนึ่งเพียงแถวเดียว
LIMIT 1 เป็นวิธีรวดเร็วในการดึงแถวเดียว เช่น สินค้าที่แพงที่สุดหรือคำสั่งซื้อล่าสุด ควรใช้ร่วมกับ ORDER BY ที่เหมาะสม
SELECT name, price
FROM products
ORDER BY price DESC
LIMIT 1;ตรวจสอบอย่างรวดเร็ว
คุณแสดง 10 แถวต่อหน้า ส่วนคำสั่งใดจะคืนค่าหน้าที่ 3?
สรุปทบทวน
ขณะนี้คุณสามารถแบ่งผลลัพธ์เป็นส่วน ๆ ได้แล้ว:
LIMIT nจำกัดจำนวนแถวOFFSET mข้ามแถว โดยOFFSET = (page-1)*size- ใช้ร่วมกับ
ORDER BYเสมอเพื่อให้หน้าแสดงผลคาดเดาได้ - เลือกการแบ่งหน้าแบบใช้คีย์แทนค่า OFFSET ขนาดใหญ่เพื่อความรวดเร็ว
ถัดไป คุณจะใช้เครื่องมือเหล่านี้เพื่อค้นหาระเบียน N อันดับแรก
SELECT name, price
FROM products
ORDER BY name
LIMIT 10 OFFSET 20;คำถามที่พบบ่อย
บทเรียน “LIMIT และ OFFSET” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “LIMIT และ OFFSET” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส SQL Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “LIMIT และ OFFSET”
ดึงข้อมูล N แถวแรกและแบ่งหน้า คุณปฏิบัติ SQL Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน SQL Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน SQL Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “LIMIT และ OFFSET” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน SQL Academy นี้ได้ไหม
ได้ บทเรียน SQL Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ