Vấn đề:
Bạn muốn giới hạn các hàng trong tập kết quả SQL Server.
Ví dụ:
Cơ sở dữ liệu của chúng tôi có một bảng có tên toy
với dữ liệu trong các cột id
, name
và price
.
id | tên | giá |
---|---|---|
161 | Xe đạp BMX | 200,00 |
121 | Robot Tobie | 185,50 |
213 | Trò chơi câu cá | 25,00 |
102 | Câu đố về động vật | 45,80 |
111 | Bộ đường đua | 126,70 |
233 | Gạch dễ dàng | 21,00 |
Hãy chọn tên và giá của đồ chơi. Nhưng chúng ta chỉ cần xem năm hàng đầu tiên.
Giải pháp 1:
SELECT name, price FROM toy ORDER BY price OFFSET 0 ROWS FETCH FIRST 5 ROWS ONLY;
Đây là kết quả của truy vấn:
name | giá |
---|---|
Easy Bricks | 21,00 |
Trò chơi câu cá | 25,00 |
Câu đố về động vật | 45,80 |
Bộ đường đua | 126,70 |
Robot Tobie | 185,50 |
Thảo luận:
Để giới hạn các hàng trong tập kết quả, hãy sử dụng ORDER BY với các mệnh đề OFFSET và FETCH tùy chọn. Đầu tiên, truy vấn sắp xếp các hàng (ORDER BY). Sau đó, bạn cho SQL Server biết đâu sẽ là hàng đầu tiên trong tập kết quả (OFFSET ... ROWS) và có bao nhiêu hàng để trả về (FETCH… ONLY).
Mệnh đề OFFSET được đặt ngay sau ORDER BY. Số nguyên cho biết hàng đầu tiên cần đếm (trong SQL Server, hàng đầu tiên là 0, hàng thứ hai là 1, v.v.), theo sau là từ khóa ROW hoặc ROWS. Bạn có thể sử dụng ROW hoặc ROWS, nhưng bạn nên sử dụng ROW cho 1 hàng và ROWS cho 0 và nhiều hàng. Nhìn vào hình ảnh:
Trong ví dụ của chúng tôi, chúng tôi sắp xếp theo giá (ORDER BY price
) và bắt đầu trả về kết quả từ hàng đầu tiên (OFFSET 0 ROWS
). Sau đó, chúng tôi sử dụng FETCH với từ khóa FIRST. Bạn có thể sử dụng FIRST hoặc NEXT; bạn nên sử dụng FIRST nếu bạn đang bắt đầu từ hàng đầu tiên mà không bỏ qua bất kỳ bản ghi nào và NEXT nếu bất kỳ hàng nào bị bỏ qua (tức là nếu OFFSET lớn hơn 0).
Cuối cùng, chúng tôi có số hàng để chọn và từ khóa CHỈ ROWS. CHỈ sử dụng ROWS nếu bạn đang trả về nhiều hàng và CHỈ ROW bạn đang giới hạn kết quả ở một hàng. Trong ví dụ của chúng tôi, chúng tôi giới hạn nó thành năm hàng (FETCH FIRST 5 ROWS ONLY
).
Dưới đây, chúng tôi có một truy vấn khác giới hạn hàng ở năm hàng nhưng bắt đầu từ hàng thứ năm trong bảng (OFFSET 4 ROWS
):
Giải pháp 2:
SELECT name, price FROM toy ORDER BY price OFFSET 4 ROWS FETCH NEXT 5 ROWS ONLY;
Đây là kết quả của truy vấn:
name | giá |
---|---|
Robot Tobie | 185,50 |
Xe đạp BMX | 200,00 |
Lưu ý rằng truy vấn này chỉ trả về hai hàng, không phải năm hàng được chỉ ra. Nhìn vào hình ảnh:
Tại sao chỉ có hai hàng? Bởi vì bảng này chỉ chứa sáu bản ghi. Nếu chúng ta bỏ qua bốn hàng đầu tiên và bắt đầu ở hàng 5, thì chỉ còn lại hai hàng.
SQL Server có một cách khác để giới hạn hàng:mệnh đề TOP.
Giải pháp 3:
SELECT TOP 3 name, price FROM toy ORDER BY price;
Đây là kết quả của truy vấn:
name | giá |
---|---|
Easy Bricks | 21,00 |
Trò chơi câu cá | 25,00 |
Câu đố về động vật | 45,80 |
Nếu bạn không cần phải bỏ qua bất kỳ hàng nào, bạn có thể sử dụng mệnh đề TOP của SQL Server để giới hạn các hàng được trả về. Nó được đặt ngay sau CHỌN. Theo sau từ khóa TOP là số nguyên cho biết số hàng cần trả về. Trong ví dụ của chúng tôi, chúng tôi đã đặt hàng theo giá và sau đó giới hạn các hàng được trả về là 3.
Không giống như phương pháp OFFSET - FETCH, TOP không yêu cầu ORDER BY. Dưới đây là một ví dụ tương tự, nhưng không sắp xếp các bản ghi:
Giải pháp 4:
SELECT TOP 3 name, price FROM toy;
Đây là kết quả của truy vấn:
Lưu ý rằng các bản ghi khác nhau đã được trả lại. Thông thường (nhưng không phải luôn luôn) các hàng sẽ được hiển thị theo thứ tự các bản ghi được chèn vào bảng.
Chúng tôi khuyên bạn nên sử dụng OFFSET và FETCH thay vì TOP, vì OFFSET và FETCH là tiêu chuẩn SQL; TOP dành riêng cho T-SQL.