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

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

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

  1. การเรียงลำดับด้วย ORDER BY
  2. การเรียงตามหลายคอลัมน์
  3. LIMIT และ OFFSET
  4. การค้นหาระเบียนอันดับต้น ๆ
← กลับไปที่ SQL Academy