SQL Server: Các lệnh giới hạn dữ liệu trong SQL Server
Trong hướng dẫn này, bạn sẽ học cách sử dụng các lệnh OFFSET FETCH
và SELECT TOP
trong SQL Server để giới hạn dữ liệu trả về.
OFFSET FETCH trong SQL Server
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ả:

Xêm thêm các ví dụ nâng cao về OFFSET và FETCH trong SQL Server ở bài viết sau:

SELECT TOP trong SQL Server
Mệnh đề SELECT TOP
cho phép bạn hạn chế số lượng bản ghi hoặc tỷ lệ phần trăm của bản ghi được trả về trong một tập kết quả truy vấn.
Vì thứ tự của các bản ghi được lưu trữ trong một bảng là không xác định, nên câu lệnh SELECT TOP
luôn được sử dụng cùng với mệnh đề ORDER BY
. Do đó, tập kết quả được giới hạn N
bản ghi đầu tiên đã được sắp xếp.
Ví dụ sau đây minh họa cú pháp của mệnh đề TOP
với câu lệnh SELECT
:
SELECT TOP (expression) [PERCENT]
[WITH TIES]
FROM
table_name
ORDER BY
column_name;
Trong cú pháp này, câu lệnh SELECT
có thể có mệnh đề khác như WHERE
, JOIN
, HAVING
và GROUP BY
.
Theo sau từ khóa TOP
là một biểu thức chỉ định số lượng bản ghi được trả về. Biểu thức được ước tính thành giá trị float nếu PERCENT
được sử dụng, nếu không, nó được chuyển đổi thành giá trị BIGINT
.
Từ khóa PERCENT
chỉ ra rằng truy vấn trả về N
phần trăm đầu tiên của các bản ghi, với N
là biểu thức expression
.
WITH TIES
cho phép bạn trả về nhiều bản ghi với giá trị phù hợp với bản ghi cuối cùng trong tập kết quả trả về. Lưu ý rằng WITH TIES
có thể khiến nhiều bản ghi được trả về hơn số lượng bạn chỉ định trong biểu thức.
Ví dụ: nếu bạn muốn trả về sản phẩm đắt nhất, bạn có thể sử dụng TOP 1
. Tuy nhiên, nếu có hai hoặc nhiều sản phẩm có cùng giá với sản phẩm đắt nhất, thì bạn sẽ bỏ lỡ các sản phẩm đắt nhất khác trong tập kết quả.
Để tránh điều này, bạn có thể sử dụng TOP 1 WITH TIES
. Nó sẽ bao gồm không chỉ sản phẩm đắt tiền đầu tiên mà còn bao gồm sản phẩm thứ khác có giá bằng sản phẩm đăt nhất.
Ví dụ về SELECT TOP 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 SELECT TOP trong SQL Server.

Sử dụng TOP với giá trị không đổi trong SQL Server
Ví dụ sau sử dụng giá trị không đổi để trả về 10 sản phẩm đắt nhất.
SELECT TOP 10
product_name,
list_price
FROM
production.products
ORDER BY
list_price DESC;
Đây là kết quả:

Sử dụng TOP để trả về tỷ lệ phần trăm của các bản ghi trong SQL Server
Ví dụ sau sử dụng PERCENT
để chỉ định số lượng sản phẩm được trả về trong tập kết quả. Bảng production.products
có 321
bản ghi, do đó, một phần trăm của 321
là một giá trị thập phân (3.21
), SQL Server sẽ làm tròn nó lên thành 4
.
SELECT TOP 1 PERCENT
product_name,
list_price
FROM
production.products
ORDER BY
list_price DESC;
Đây là kết quả:

Sử dụng TOP WITH TIES để bao gồm các bản ghi khớp với các giá trị ở bản ghi cuối cùng
Câu lệnh sau đây trả về ba sản phẩm đắt nhất:
SELECT TOP 3 WITH TIES
product_name,
list_price
FROM
production.products
ORDER BY
list_price DESC;
Đây là kết quả:

Xem thêm về SELECT TOP trong SQL Server tại bài viết:

Trong hướng dẫn này, bạn đã học cách sử dụng lệnh OFFSET FETCH
và SELECT TOP
trong SQL Server để giới hạn số lượng bản ghi trả về bởi một truy vấn.