ฉันมีคำถามง่ายๆกับ Sqlite อะไรคือความแตกต่างระหว่างสิ่งนี้:
Select * from Animals LIMIT 100 OFFSET 50
และ
Select * from Animals LIMIT 100,50
ฉันมีคำถามง่ายๆกับ Sqlite อะไรคือความแตกต่างระหว่างสิ่งนี้:
Select * from Animals LIMIT 100 OFFSET 50
และ
Select * from Animals LIMIT 100,50
คำตอบ:
รูปแบบไวยากรณ์ทั้งสองมีความสับสนเล็กน้อยเนื่องจากมีการย้อนกลับตัวเลข:
LIMIT <skip>, <count>
เทียบเท่ากับ:
LIMIT <count> OFFSET <skip>
มันเข้ากันได้กับไวยากรณ์จาก MySQL และ PostgreSQL MySQL รองรับทั้งรูปแบบไวยากรณ์และเอกสารของมันอ้างว่าไวยากรณ์ที่สองที่มี OFFSET นั้นหมายถึงการให้ความเข้ากันได้กับ PostgreSQL PostgreSQL docsแสดงว่าสนับสนุนเฉพาะไวยากรณ์ที่สองเท่านั้นและเอกสารของ SQLiteแสดงว่ารองรับทั้งสองโดยแนะนำไวยากรณ์ที่สองเพื่อหลีกเลี่ยงความสับสน
อย่างไรก็ตามการใช้ LIMIT โดยไม่ใช้ ORDER BY เป็นครั้งแรกอาจไม่ได้ให้ผลลัพธ์ที่คุณต้องการเสมอไป ในทางปฏิบัติ SQLite จะส่งคืนแถวตามลำดับซึ่งอาจถูกกำหนดโดยวิธีจัดเก็บทางกายภาพในไฟล์ แต่นี่ไม่ได้แปลว่าเป็นไปตามลำดับที่คุณต้องการ วิธีเดียวที่จะได้รับคำสั่งซื้อที่คาดการณ์ได้คือการใช้คำสั่งซื้อโดยชัดเจน
LIMIT <count> OFFSET <skip>
มีความชัดเจนมากขึ้น ขอบคุณ.
หลังเป็นไวยากรณ์ทางเลือกที่มีหนึ่งcaveat :
หากใช้เครื่องหมายจุลภาคแทนคีย์เวิร์ด OFFSET ดังนั้นอ็อฟเซ็ตคือหมายเลขแรกและขีด จำกัด คือตัวเลขที่สอง สิ่งที่ขัดแย้งกันนี้ดูเหมือนเป็นการจงใจ - มันเพิ่มความเข้ากันได้สูงสุดกับระบบฐานข้อมูล SQL ดั้งเดิม
ฉันทำการทดสอบและไม่มีประสิทธิภาพที่แตกต่างกัน
นั่นเป็นเพียงความเข้ากันได้กับภาษา 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 วินาที