แบบสอบถาม Sqlite LIMIT / OFFSET


153

ฉันมีคำถามง่ายๆกับ Sqlite อะไรคือความแตกต่างระหว่างสิ่งนี้:

Select * from Animals LIMIT 100 OFFSET 50

และ

Select * from Animals LIMIT 100,50

9
โปรดทำเครื่องหมายว่าเป็นคำตอบหากมันได้ลบล้างข้อสงสัยของคุณตามที่ระบุไว้ในความคิดเห็น
Mubashar

คำตอบ:


270

รูปแบบไวยากรณ์ทั้งสองมีความสับสนเล็กน้อยเนื่องจากมีการย้อนกลับตัวเลข:

LIMIT <skip>, <count>

เทียบเท่ากับ:

LIMIT <count> OFFSET <skip>

มันเข้ากันได้กับไวยากรณ์จาก MySQL และ PostgreSQL MySQL รองรับทั้งรูปแบบไวยากรณ์และเอกสารของมันอ้างว่าไวยากรณ์ที่สองที่มี OFFSET นั้นหมายถึงการให้ความเข้ากันได้กับ PostgreSQL PostgreSQL docsแสดงว่าสนับสนุนเฉพาะไวยากรณ์ที่สองเท่านั้นและเอกสารของ SQLiteแสดงว่ารองรับทั้งสองโดยแนะนำไวยากรณ์ที่สองเพื่อหลีกเลี่ยงความสับสน

อย่างไรก็ตามการใช้ LIMIT โดยไม่ใช้ ORDER BY เป็นครั้งแรกอาจไม่ได้ให้ผลลัพธ์ที่คุณต้องการเสมอไป ในทางปฏิบัติ SQLite จะส่งคืนแถวตามลำดับซึ่งอาจถูกกำหนดโดยวิธีจัดเก็บทางกายภาพในไฟล์ แต่นี่ไม่ได้แปลว่าเป็นไปตามลำดับที่คุณต้องการ วิธีเดียวที่จะได้รับคำสั่งซื้อที่คาดการณ์ได้คือการใช้คำสั่งซื้อโดยชัดเจน


2
LIMIT <count> OFFSET <skip>มีความชัดเจนมากขึ้น ขอบคุณ.
Guido Mocha

คำตอบที่คล้ายกันนี้มีทางออกที่ดีและมีประสิทธิภาพดีหากลำดับของแถวสำคัญ stackoverflow.com/a/28860492/5016333
Rodrigo V

23

หลังเป็นไวยากรณ์ทางเลือกที่มีหนึ่งcaveat :

หากใช้เครื่องหมายจุลภาคแทนคีย์เวิร์ด OFFSET ดังนั้นอ็อฟเซ็ตคือหมายเลขแรกและขีด จำกัด คือตัวเลขที่สอง สิ่งที่ขัดแย้งกันนี้ดูเหมือนเป็นการจงใจ - มันเพิ่มความเข้ากันได้สูงสุดกับระบบฐานข้อมูล SQL ดั้งเดิม


5

ฉันทำการทดสอบและไม่มีประสิทธิภาพที่แตกต่างกัน

นั่นเป็นเพียงความเข้ากันได้กับภาษา sql อื่น ๆ

เวลาทำงานของทั้งสองรุ่นเหมือนกัน

ฉันสร้าง sqlite db ด้วย table1 ที่มีแถว 100,000 แถว ฉันรันการทดสอบครั้งต่อไป

long timeLimitOffset = 0;
long timeLimitComma = 0;
for (int i = 0; i < 100000; i++)
{
   //first version
   timeLimitOffset += SqlDuraction("Select * from table1  order by col1 LIMIT " + (i + 1) + " OFFSET " + (1001 - i) + "");
   // second version
   timeLimitComma += SqlDuraction("Select * from table1 order by col1 LIMIT " + (1001 - i) + " , " + (i + 1) + "");
}

เวลาแปรผันเป็น 0.001 วินาที


1
ทำไมถึงมีประสิทธิภาพที่แตกต่างกัน? พวกเขาเหมือนกัน!
Abhinav Gauniyal
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.