Truy vấn SITite LIMIT / OFFSET


153

Tôi có câu hỏi đơn giản với Sqlite. Sự khác biệt giữa cái này là gì:

Select * from Animals LIMIT 100 OFFSET 50

Select * from Animals LIMIT 100,50

9
Vui lòng đánh dấu nó là câu trả lời nếu nó đã xóa tan nghi ngờ của bạn như bạn đã đề cập trong các bình luận.
Mubashar 16/2/2015

Câu trả lời:


270

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.


2
LIMIT <count> OFFSET <skip>rõ ràng hơn Cảm ơn bạn.
Guido Mocha

Câu trả lời tương tự này có một giải pháp tốt với hiệu suất tốt nếu thứ tự của các hàng quan trọng. stackoverflow.com/a/28860492/5016333
Rodrigo V

23

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ũ.


5

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


1
Tại sao có sự khác biệt trong hiệu suất? họ giống nhau!
Abhinav Gauniyal
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.