OFFSET FETCH trong SQL Server
Trong hướng dẫn này, bạn sẽ tìm hiểu cách sử dụng các mệnh đề OFFSET
và FETCH
trong SQL Server để giới hạn số lượng bản ghi được trả về bởi một truy vấn.
Các mệnh đề OFFSET
và FETCH
là các tùy chọn của mệnh đề ORDER BY
. Chúng cho phép bạn giới hạn số lượng bản ghi được trả về bởi một truy vấn.
Ví dụ sau đây minh họa cú pháp của mệnh đề OFFSET
và FETCH
:
ORDER BY column_list [ASC | DESC]
OFFSET offset_row_count {ROW | ROWS}
FETCH {FIRST | NEXT} fetch_row_count {ROW | ROWS} ONLY
Trong cú pháp này:
- Mệnh đề
OFFSET
quy định cụ thể số bản ghi bị bỏ qua trước khi bắt đầu trả về các bản ghi từ truy vấn.offset_row_count
có thể là một hằng số, biến hoặc tham số lớn hơn hoặc bằng 0. - Mệnh đề
FETCH
quy định cụ thể số lượng bản ghi trả về sau khi mệnh đềOFFSET
đã được xử lý.fetch_row_count
có thể là một hằng số, biến hoặc tham số lớn hơn hoặc bằng 1. - Mệnh đề
OFFSET
là bắt buộc trong khi mệnh đềFETCH
là tùy chọn. Ngoài ra,FIRST
vàNEXT
là các từ đồng nghĩa tương ứng để bạn có thể sử dụng chúng thay thế cho nhau. Tương tự, bạn có thể sử dụngFIRST
vàNEXT
hoán đổi cho nhau.
Hình ảnh sau đây minh họa các mệnh đề OFFSET
và FETCH
:
Lưu ý rằng bạn phải sử dụng các mệnh đề OFFSET
và FETCH
với mệnh đề ORDER BY
. Nếu không, bạn sẽ nhận được một lỗi.
Các mệnh đề OFFSET
và FETCH
được ưu tiên để thực hiện giải pháp truy vấn phân trang hơn mệnh đề TOP
.
Các mệnh đề
OFFSET
vàFETCH
đã có từ SQL Server 2012 (11.x) trở lên và cơ sở dữ liệu SQL Azure.
Ví dụ về OFFSET và FETCH trong SQL Server
Chúng tôi sẽ sử dụng bảng products
từ cơ sở dữ liệu mẫu để làm ví dụ minh họa cho OFFSET và FETCH trong SQL Server.
Truy vấn sau đây trả về tất cả các sản phẩm từ bảng products
và sắp xếp các sản phẩm theo giá niêm yết và tên của chúng:
SELECT
product_name,
list_price
FROM
production.products
ORDER BY
list_price,
product_name;
Đây là kết quả:
Để bỏ qua 10 sản phẩm đầu tiên và trả lại phần còn lại, bạn sử dụng mệnh đề OFFSET
như trong câu lệnh sau:
SELECT
product_name,
list_price
FROM
production.products
ORDER BY
list_price,
product_name
OFFSET 10 ROWS;
Đây là kết quả:
Để bỏ qua 10 sản phẩm đầu tiên và chọn 10 sản phẩm tiếp theo, bạn sử dụng cả hai mệnh đề OFFSET
và FETCH
như sau:
SELECT
product_name,
list_price
FROM
production.products
ORDER BY
list_price,
product_name
OFFSET 10 ROWS
FETCH NEXT 10 ROWS ONLY;
Đây là kết quả:
Để trả về 10 sản phẩm đắt nhất, bạn sử dụng cả hai mệnh đề OFFSET
và FETCH
như sau:
SELECT
product_name,
list_price
FROM
production.products
ORDER BY
list_price DESC,
product_name
OFFSET 0 ROWS
FETCH FIRST 10 ROWS ONLY;
Đây là kết quả:
Trong ví dụ này, mệnh đề ORDER BY
sắp xếp các sản phẩm theo giá niêm yết của chúng theo thứ tự giảm dần. Sau đó, mệnh đề OFFSET
bỏ qua 0 bản ghi và mệnh đề FETCH
lấy 10 sản phẩm đầu tiên từ danh sách.
Trong hướng dẫn này, bạn đã học cách sử dụng mệnh đề OFFSET
và FETCH
trong SQL Server để giới hạn số lượng bản ghi được trả về bởi một truy vấn.