LIMIT, OFFSET และ FETCH FIRST
ไวยากรณ์การแบ่งหน้าใน MySQL, Postgres และ SQL Server
LIMIT, OFFSET และ FETCH FIRST เป็นบทเรียน Coding Interview Prep ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Coding Interview Prep และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Coding Interview Prep มีบทเรียนทั้งหมด 4 บทเรียน
การแบ่งหน้าคือคำถามข้ามระบบฐานข้อมูล
คำถามว่า “คุณจะดึง 10 แถวแรกอย่างไร” ฟังดูง่ายจนกระทั่งผู้สัมภาษณ์เพิ่มเงื่อนไขว่า “และให้ทำด้วยภาษาค้นข้อมูลมาตรฐาน” หรือ “ตอนนี้ให้ทำในเซิร์ฟเวอร์เอสคิวแอล” ไวยากรณ์สำหรับจำกัดจำนวนแถวเป็นหนึ่งในความสามารถที่แตกต่างกันมากที่สุดระหว่างฐานข้อมูลแต่ละระบบ
บทเรียนนี้ครอบคลุมรูปแบบหลักสามแบบ: LIMIT (MySQL/PostgreSQL/เอสคิวไลต์), OFFSET ... FETCH (มาตรฐาน ANSI และเซิร์ฟเวอร์เอสคิวแอล) และ TOP แบบเก่า (เซิร์ฟเวอร์เอสคิวแอล)
LIMIT ใน MySQL และ PostgreSQL
รูปแบบที่พบได้บ่อยที่สุดคือ LIMIT n ซึ่งจำกัดผลลัพธ์ไว้ไม่เกิน n แถว โดย MySQL PostgreSQL และเอสคิวไลต์รองรับรูปแบบนี้
สิ่งสำคัญคือ LIMIT จะทำงานหลังจาก ORDER BY ตามลำดับการทำงานเชิงตรรกะ ดังนั้นคุณจึงมักใช้ทั้งสองคำสั่งคู่กัน การจำกัดจำนวนแถวโดยไม่เรียงลำดับจะให้ชุดแถวที่เลือกมาอย่างไม่แน่นอน
SELECT name, salary
FROM employees
ORDER BY salary DESC
LIMIT 10;OFFSET สำหรับข้ามแถว
การแบ่งหน้าต้องใช้ค่าเลื่อนเพื่อข้ามหน้าก่อนหน้า OFFSET m จะข้าม m แถวแรกก่อนที่การจำกัดจำนวนแถวจะมีผล
หากต้องการหน้า 3 โดยให้แต่ละหน้ามี 10 แถว คุณจะข้าม 20 แถวแล้วดึงมา 10 แถว สูตรทั่วไปคือ OFFSET = (page - 1) * page_size
SELECT name, salary
FROM employees
ORDER BY salary DESC
LIMIT 10 OFFSET 20;ไวยากรณ์คั่นด้วยจุลภาคของ MySQL
MySQL ยังรองรับรูปแบบที่รับอาร์กิวเมนต์สองตัวคั่นด้วยจุลภาคด้วย: LIMIT offset, count โปรดสังเกตว่าลำดับของอาร์กิวเมนต์กลับด้านจากรูปแบบคำหลัก ซึ่งทำให้หลายคนสับสน
LIMIT 20, 10 หมายถึงข้าม 20 แถวแล้วดึงมา 10 แถว ซึ่งมีความหมายเหมือนกับ LIMIT 10 OFFSET 20 ในการสัมภาษณ์ ควรใช้รูปแบบคำหลักเพื่อให้เข้าใจได้ชัดเจนกว่า
SELECT name, salary
FROM employees
ORDER BY salary DESC
LIMIT 20, 10;มาตรฐาน ANSI: FETCH FIRST
มาตรฐานของภาษาค้นข้อมูลใช้ OFFSET ... ROWS FETCH FIRST ... ROWS ONLY PostgreSQL ออราเคิล 12c ขึ้นไป ดีบีทู และเซิร์ฟเวอร์เอสคิวแอล 2012 ขึ้นไป ต่างก็รองรับรูปแบบนี้
รูปแบบนี้อ่านแล้วมีรายละเอียดมาก แต่เป็นตัวเลือกที่ใช้ได้กับหลายระบบ ROW และ ROWS ใช้แทนกันได้ ส่วน FIRST และ NEXT เป็นคำพ้องความหมายกัน
SELECT name, salary
FROM employees
ORDER BY salary DESC
OFFSET 20 ROWS
FETCH FIRST 10 ROWS ONLY;TOP ของ SQL Server
โค้ด SQL Server รุ่นเก่าใช้ TOP n ต่อจาก SELECT ทันที โดยไม่มี OFFSET ในตัว จึงไม่สามารถแบ่งหน้าเกินหน้าแรกได้ด้วยตัวเอง
ผู้สัมภาษณ์อาจขอให้คุณแปลง TOP เป็นรูปแบบมาตรฐาน SELECT TOP 10 ที่ใช้ร่วมกับ ORDER BY เทียบเท่ากับ FETCH FIRST 10 ROWS ONLY
SELECT TOP 10 name, salary
FROM employees
ORDER BY salary DESC;TOP WITH TIES
คุณสมบัติที่น่าสนใจของ SQL Server คือ TOP n WITH TIES จะคืนแถวเพิ่มเติมเมื่อแถวนั้นมีค่าเท่ากับแถวสุดท้ายตามคีย์ของ ORDER BY
หากมีสามคนได้รับเงินเดือนสูงสุดเป็นอันดับที่ 10 เท่ากัน TOP 10 WITH TIES จะคืนข้อมูลของทุกคน ซึ่งอาจได้ทั้งหมด 12 แถว รูปแบบที่เทียบเท่ากันในมาตรฐานคือ FETCH FIRST ... WITH TIES
SELECT TOP 10 WITH TIES name, salary
FROM employees
ORDER BY salary DESC;ORDER BY จำเป็นสำหรับการแบ่งหน้าที่ให้ผลแน่นอน
ประเด็นสำคัญที่สุดในการสัมภาษณ์คือ การใช้ OFFSET/LIMIT โดยไม่มี ORDER BY ที่กำหนดผลลัพธ์แน่นอนนั้นไม่ปลอดภัย ระบบฐานข้อมูลอาจเลือกแถวที่แตกต่างกันสำหรับ "หน้าที่ 2" จากที่เลือกสำหรับ "หน้าที่ 1" เพราะลำดับพื้นฐานไม่ได้ถูกกำหนดไว้
ควรเรียงลำดับด้วยชุดคีย์ที่ไม่ซ้ำหรือมีความเป็นเอกลักษณ์เพียงพอเสมอ หากคอลัมน์ที่ใช้เรียงลำดับมีค่าซ้ำ ให้เพิ่มคีย์หลักเป็นตัวตัดสินกรณีเสมอ เพื่อไม่ให้หน้าเว็บมีแถวซ้ำกันหรือข้ามบางแถว
SELECT id, name, salary
FROM employees
ORDER BY salary DESC, id ASC
LIMIT 10 OFFSET 20;เหตุใดการแบ่งหน้าด้วย OFFSET จึงขยายขนาดได้ไม่ดี
ผู้สัมภาษณ์ระดับอาวุโสมักเจาะลึกเรื่องประสิทธิภาพ แม้ OFFSET จะมีค่ามาก ฐานข้อมูลก็ยังต้องสร้างและทิ้งแถวทั้งหมดที่ถูกข้ามไป OFFSET 100000 LIMIT 10 ต้องอ่าน 100,010 แถวเพื่อคืนผลลัพธ์ 10 แถว
ต้นทุนจะเพิ่มขึ้นเป็นเส้นตรงตามหมายเลขหน้า ทำให้การแบ่งหน้าไปยังหน้าลึก ๆ ช้าลงเมื่อใช้กับตารางขนาดใหญ่
การแบ่งหน้าแบบคีย์เซต (การค้นหา)
ทางเลือกที่ขยายขนาดได้ดีคือ การแบ่งหน้าแบบคีย์เซต แทนที่จะข้ามแถวตามจำนวน คุณจะกรองข้อมูลโดยเริ่มหลังค่าล่าสุดที่พบ วิธีนี้ใช้การสแกนช่วงดัชนีและยังคงทำงานได้รวดเร็วไม่ว่าจะอยู่ที่หน้าลึกเพียงใด
คุณเก็บคีย์ที่ใช้เรียงลำดับของแถวสุดท้ายจากหน้าก่อนหน้าไว้ แล้วขอแถวที่อยู่ถัดจากค่านั้น การกล่าวถึงการแบ่งหน้าแบบคีย์เซตถือเป็นสัญญาณที่ดีว่าคุณมีประสบการณ์ระดับอาวุโส
SELECT id, name, created_at
FROM events
WHERE created_at < '2026-01-01 10:00:00'
ORDER BY created_at DESC
LIMIT 10;ตารางสรุปแยกตามระบบฐานข้อมูล
จดจำตารางนี้ไว้เพื่อเรียกคืนความรู้ได้อย่างรวดเร็วในการสัมภาษณ์:
- MySQL / Postgres / SQLite:
LIMIT n OFFSET m - มาตรฐาน / SQL Server รุ่น 2012 ขึ้นไป / Oracle รุ่น 12c ขึ้นไป:
OFFSET m ROWS FETCH FIRST n ROWS ONLY - SQL Server รุ่นเก่า:
SELECT TOP n(ไม่มี OFFSET) - Oracle รุ่นเก่า (ก่อน 12c): กรองด้วย
ROWNUMในคิวรีย่อย
ตรวจสอบอย่างรวดเร็ว
เลือกคิวรีสำหรับหน้าที่ 3 ที่ถูกต้อง เมื่อกำหนดขนาดหน้าเป็น 10
ทบทวน
สาระสำคัญของการแบ่งหน้า:
LIMIT/OFFSETสำหรับ MySQL, Postgres และ SQLite;OFFSET ... FETCH FIRSTสำหรับมาตรฐานและ SQL Server รุ่นใหม่;TOPสำหรับ SQL Server รุ่นเก่าOFFSET = (page - 1) * page_size- จับคู่กับ
ORDER BYที่กำหนดผลลัพธ์แน่นอนเสมอ และเพิ่มตัวตัดสินกรณีเสมอที่ไม่ซ้ำ - ค่า OFFSET ขนาดใหญ่ทำงานช้า ควรใช้ การแบ่งหน้าแบบคีย์เซต สำหรับการแบ่งหน้าไปยังหน้าลึก ๆ
คำถามที่พบบ่อย
บทเรียน “LIMIT, OFFSET และ FETCH FIRST” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “LIMIT, OFFSET และ FETCH FIRST” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Coding Interview Prep ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Coding Interview Prep มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “LIMIT, OFFSET และ FETCH FIRST”
ไวยากรณ์การแบ่งหน้าใน MySQL, Postgres และ SQL Server คุณปฏิบัติ Coding Interview Prep ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Coding Interview Prep หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Coding Interview Prep บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “LIMIT, OFFSET และ FETCH FIRST” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Coding Interview Prep นี้ได้ไหม
ได้ บทเรียน Coding Interview Prep ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การจัดเรียงหลายคอลัมน์และตำแหน่งของ NULL
- LIMIT, OFFSET และ FETCH FIRST
- ส่งคืนแถว N อันดับแรกอย่างเชื่อถือได้
- จัดเรียงด้วยนิพจน์และนามแฝง