Mệnh đề LIMIT trong MySQL
Trong hướng dẫn này, bạn sẽ học cách sử dụng mệnh đề LIMIT
trong MySQL để hạn chế số hàng được trả về bởi một truy vấn.
Giới thiệu về mệnh đề LIMIT trong MySQL
Mệnh đề LIMIT
được sử dụng trong câu lệnh SELECT
để giới hạn số hàng trả về. Mệnh đề LIMIT
chấp nhận một hoặc hai đối số. Giá trị của cả hai đối số phải bằng 0 hoặc số nguyên dương.
Sau đây minh họa cú pháp mệnh đề LIMIT
với hai đối số:
SELECT
select_list
FROM
table_name
LIMIT [offset,] row_count;
Trong cú pháp này:
- Giá trị này
offset
chỉ định vị trí của hàng đầu tiên sẽ trả về.offset
của hàng đầu tiên là 0, không phải 1. row_count
chỉ định số hàng tối đa để trả về.
Hình ảnh sau đây minh họa mệnh đề LIMIT
:
Khi bạn sử dụng mệnh đề LIMIT
có một đối số, MySQL sẽ sử dụng đối số này để xác định số hàng tối đa trả về từ hàng đầu tiên của tập kết quả.
Do đó, hai mệnh đề này là tương đương:
LIMIT row_count;
Và
LIMIT 0, row_count;
Ngoài cú pháp trên, MySQL cung cấp cú pháp mệnh đề LIMIT
thay thế sau:
LIMIT row_count OFFSET offset
Mệnh đề LIMIT và ORDER BY
Theo mặc định, câu lệnh SELECT
trả về các hàng theo thứ tự không xác định. Khi bạn thêm mệnh đề LIMIT
vào câu lệnh SELECT
, các hàng trả về là không thể đoán trước.
Do đó, để đảm bảo mệnh đề LIMIT
trả về kết quả mong đợi, bạn nên luôn sử dụng nó với mệnh đề ORDER BY
như sau:
SELECT
select_list
FROM
table_name
ORDER BY
sort_expression
LIMIT offset, row_count;
Ví dụ mệnh đề LIMIT trong MySQL
Chúng ta sẽ sử dụng bảng customers
từ cơ sở dữ liệu mẫu để minh họa.
Sử dụng LIMIT trong MySQL để lấy các hàng cao nhất hoặc thấp nhất
Câu lệnh này sử dụng mệnh đề LIMIT
để đưa ra năm khách hàng hàng đầu có tín dụng cao nhất:
SELECT
customerNumber,
customerName,
creditLimit
FROM
customers
ORDER BY creditLimit DESC
LIMIT 5;
Đầu ra:
Trong ví dụ này:
- Đầu tiên, mệnh đề
ORDER BY
sắp xếp các khách hàng theo các khoản tín dụng từ cao đến thấp. - Sau đó, mệnh đề
LIMIT
trả về 5 hàng đầu tiên.
Tương tự, ví dụ này sử dụng mệnh đề LIMIT
để tìm năm khách hàng có tín dụng thấp nhất:
SELECT
customerNumber,
customerName,
creditLimit
FROM
customers
ORDER BY creditLimit
LIMIT 5;
Đầu ra:
Trong ví dụ này:
- Đầu tiên, mệnh đề
ORDER BY
sắp xếp các khách hàng theo các khoản tín dụng từ thấp đến cao. - Sau đó, mệnh đề
LIMIT
trả về 5 hàng đầu tiên.
Bởi vì có hơn 5 khách hàng có tín dụng bằng 0, kết quả của truy vấn trên có thể dẫn đến một kết quả không nhất quán.
Để khắc phục sự cố này, bạn cần thêm nhiều cột hơn vào mệnh đề ORDER BY
để giới hạn hàng theo thứ tự duy nhất:
SELECT
customerNumber,
customerName,
creditLimit
FROM
customers
ORDER BY
creditLimit,
customerNumber
LIMIT 5;
Đầu ra:
Sử dụng mệnh đề LIMIT trong MySQL để phân trang
Khi hiển thị dữ liệu trên màn hình, bạn thường muốn chia các hàng thành các trang, trong đó mỗi trang chứa một số lượng giới hạn các hàng như 10 hoặc 20.
Để tính số trang, bạn lấy tổng số hàng chia cho số hàng trên mỗi trang. Để tìm nạp các hàng của một trang cụ thể, bạn có thể sử dụng mệnh đề LIMIT
.
Truy vấn này sử dụng hàm tập hợp COUNT(*)
để lấy tổng số hàng từ bảng customers
:
SELECT
COUNT(*)
FROM
customers;
Đầu ra:
+----------+
| COUNT(*) |
+----------+
| 122 |
+----------+
1 row in set (0.00 sec)
Giả sử rằng mỗi trang có 10 hàng; để hiển thị 122 khách hàng, bạn có 13 trang. Trang thứ 13 cuối cùng chỉ chứa hai hàng.
Truy vấn này sử dụng mệnh đề LIMIT
để lấy các hàng của trang 1 chứa 10 khách hàng đầu tiên được sắp xếp theo tên khách hàng:
SELECT
customerNumber,
customerName
FROM
customers
ORDER BY customerName
LIMIT 10;
Đầu ra:
Truy vấn này sử dụng mệnh đề LIMIT
để lấy các hàng của trang thứ hai bao gồm các hàng 11 – 20:
SELECT
customerNumber,
customerName
FROM
customers
ORDER BY customerName
LIMIT 10, 10;
Đầu ra:
Trong ví dụ này, mệnh đề LIMIT 10, 10
trả về 10 hàng cho hàng 11-20.
Sử dụng LIMIT trong MySQL để nhận giá trị nth cao nhất hoặc thấp nhất
Để nhận giá trị nth cao nhất hoặc thấp nhất, bạn sử dụng mệnh đề LIMIT
sau:
SELECT select_list
FROM table_name
ORDER BY sort_expression
LIMIT n-1, 1;
Mệnh đề LIMIT n-1, 1
trả về 1
hàng bắt đầu từ hàng n
.
Ví dụ: phần sau tìm khách hàng có tín dụng cao thứ hai:
SELECT
customerName,
creditLimit
FROM
customers
ORDER BY
creditLimit DESC
LIMIT 1,1;
Đầu ra:
Hãy kiểm tra kỹ kết quả. Truy vấn này trả về tất cả các khách hàng được sắp xếp theo tín dụng từ cao đến thấp:
SELECT
customerName,
creditLimit
FROM
customers
ORDER BY
creditLimit DESC;
Đầu ra:
Như bạn có thể thấy rõ từ đầu ra, kết quả đúng như mong đợi.
Lưu ý rằng kỹ thuật này hoạt động khi không có hai khách hàng có cùng hạn mức tín dụng. Để có kết quả chính xác hơn, bạn nên sử dụng hàm
DENSE_RANK()
.
Mệnh đề LIMIT & DISTINCT trong MySQL
Nếu bạn sử dụng mệnh đề LIMIT
với mệnh đề DISTINCT
, MySQL ngay lập tức ngừng tìm kiếm khi nó tìm thấy số hàng duy nhất được chỉ định trong mệnh đề LIMIT
.
Ví dụ sử dụng mệnh đề LIMIT
với mệnh đề DISTINCT
để trả về năm trạng thái duy nhất đầu tiên trong bảng customers
:
SELECT DISTINCT
state
FROM
customers
WHERE
state IS NOT NULL
LIMIT 5;
Đầu ra:
Tóm lược
- Sử dụng mệnh đề
LIMIT
trong MySQL để giới hạn số hàng được trả về bởi câu lệnhSELECT
.