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 FETCHSELECT TOP trong SQL Server để giới hạn dữ liệu trả về.

OFFSET FETCH trong SQL Server

Các mệnh đề OFFSETFETCH 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 đề OFFSETFETCH:

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, FIRSTNEXT 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ụng  FIRSTNEXT hoán đổi cho nhau.

Hình ảnh sau đây minh họa các mệnh đề OFFSETFETCH:

OFFSET FETCH trong SQL Server

Lưu ý rằng bạn phải sử dụng các mệnh đề OFFSETFETCH với mệnh đề ORDER BY. Nếu không, bạn sẽ nhận được một lỗi.

Các mệnh đề OFFSETFETCH đượ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 đề OFFSETFETCH đã 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.

Bảng Products trong cơ sở dữ liệu mẫu 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ả:

Ví dụ về OFFSET và FETCH trong SQL Server

Để 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ả:

Ví dụ về OFFSET và FETCH trong SQL Server

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

OFFSET FETCH trong SQL Server | Comdy
Cách sử dụng mệnh đề OFFSET và FETCH trong SQL Server để giới hạn số lượng bản ghi trả về.

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, HAVINGGROUP 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.

Bảng Products trong cơ sở dữ liệu mẫu 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 với giá trị không đổi trong SQL Server

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.products321 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 để trả về tỷ lệ phần trăm của các bản ghi trong SQL Server

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ả:

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

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

SELECT TOP trong SQL Server | Comdy
Cách sử dụng câu lệnh SELECT TOP trong SQL Server để giới hạn các bản ghi được trả về bởi một truy vấn.

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

SQL Server
Bài Viết Liên Quan:
INTERSECT trong SQL Server
Trung Nguyen 22/11/2020
INTERSECT trong SQL Server

Tìm hiểu cách sử dụng toán tử INTERSECT trong SQL Server để trả về phần giao nhau của các tập kết quả của hai truy vấn.

EXCEPT trong SQL Server
Trung Nguyen 22/11/2020
EXCEPT trong SQL Server

Tìm hiểu cách sử dụng EXCEPT trong SQL Server để loại trừ tập kết quả của một truy vấn ra khỏi tập kết quả của một truy vấn khác.

SQL Server: Hướng dẫn subquery trong SQL Server từ A-Z
Trung Nguyen 22/11/2020
SQL Server: Hướng dẫn subquery trong SQL Server từ A-Z

Tìm hiểu về subquery, toán tử EXISTS, ANY, ALL trong SQL Server và cách sử dụng truy vấn con để truy vấn dữ liệu.

UNION trong SQL Server
Trung Nguyen 22/11/2020
UNION trong SQL Server

Tìm hiểu cách sử dụng UNION trong SQL Server để kết hợp kết quả của hai hoặc nhiều truy vấn thành một tập kết quả duy nhất.