Câu trả lời:
Hai dạng cú pháp hơi khó hiểu vì chúng đảo ngược các số:
LIMIT <skip>, <count>
Tương đương với:
LIMIT <count> OFFSET <skip>
Nó tương thích với cú pháp từ MySQL và PostgreSQL. MySQL hỗ trợ cả hai dạng cú pháp và các tài liệu của nó tuyên bố rằng cú pháp thứ hai với OFFSET có nghĩa là cung cấp khả năng tương thích với PostgreQuery. Các tài liệu PostgreQuery cho thấy nó chỉ hỗ trợ cú pháp thứ hai và các tài liệu của SQLite cho thấy rằng nó hỗ trợ cả hai, khuyến nghị cú pháp thứ hai để tránh nhầm lẫn.
Nhân tiện, sử dụng LIMIT mà không sử dụng ORDER BY trước tiên có thể không phải lúc nào cũng cho bạn kết quả như bạn dự định. Trong thực tế, SQLite sẽ trả về các hàng theo một số thứ tự, có thể được xác định bằng cách chúng được lưu trữ vật lý trong tệp. Nhưng điều này không nhất thiết có nghĩa là theo thứ tự bạn muốn. Cách duy nhất để có được một đơn đặt hàng có thể dự đoán được là sử dụng ORDER BY một cách rõ ràng.
LIMIT <count> OFFSET <skip>
rõ ràng hơn Cảm ơn bạn.
Cái sau là một cú pháp thay thế với một cảnh báo :
Nếu dấu phẩy được sử dụng thay cho từ khóa OFFSET, thì phần bù là số thứ nhất và giới hạn là số thứ hai. Sự mâu thuẫn dường như này là có chủ ý - nó tối đa hóa khả năng tương thích với các hệ thống cơ sở dữ liệu SQL cũ.
Tôi đã thực hiện một số thử nghiệm và không có sự khác biệt trong hiệu suất.
Điều đó chỉ dành cho khả năng tương thích với các ngôn ngữ sql khác.
Thời gian chạy của cả hai phiên bản là như nhau.
Tôi đã tạo db sqlite với bảng1 với 100000 hàng. Tôi chạy thử nghiệm tiếp theo
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) + "");
}
Thời gian thay đổi trong 0,001 giây