Xin chào các bạn! Tiếp tục với seri MySQL cơ bản, trong bài viết này các bạn sẽ tìm hiểu được cách sử dụng mệnh đề LIMIT của MySQL để hạn chế số lượng hàng được trả về bởi một truy vấn.
Mệnh LIMIT
đề được sử dụng trong SELECT
câu lệnh để hạn chế 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 là số không hoặc số nguyên dương .
Sau đây minh họa LIMIT
cú pháp mệnh đề với hai đối số:
SELECT select_list FROM table_name LIMIT [offset,] row_count;
Trong cú pháp này:
offset
chỉ định phần bù của hàng đầu tiên sẽ trả về. Hàng offset
đầu tiên là 0, không phải 1.row_count
chỉ định số lượng hàng tối đa để trả về.Hình ảnh sau đây minh họa LIMIT
mệnh đề:
Khi bạn sử dụng LIMIT
mệnh đề với một đối số, MySQL sẽ sử dụng đối số này để xác định số hàng tối đa sẽ 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 LIMIT
cú pháp mệnh đề thay thế sau:
LIMIT row_count OFFSET offset
Theo mặc định, SELECT
câu lệnh trả về các hàng theo thứ tự không xác định. Khi bạn thêm LIMIT
mệnh đề vào SELECT
câu lệnh, các hàng được trả về sẽ không thể đoán trước.
Do đó, để đảm bảo LIMIT
mệnh đề trả về kết quả như mong đợi, bạn phải luôn sử dụng nó với một ORDER BY
mệnh đề như sau:
SELECT select_list FROM table_name ORDER BY sort_expression LIMIT offset, row_count;
Chúng tôi sẽ sử dụng customers
bảng từ cơ sở dữ liệu mẫu để lấy ví dụ.
Câu lệnh này sử dụng LIMIT
mệnh đề để có được 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;
Kết quả:
Trong ví dụ này:
ORDER BY
sắp xếp khách hàng theo tín dụng từ cao đến thấp.LIMIT
trả về 5 hàng đầu tiên.Tương tự, ví dụ này sử dụng LIMIT
mệnh đề để 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;
Kết quả:
Trong ví dụ này:
ORDER BY
sắp xếp khách hàng theo tín dụng từ thấp đến cao.LIMIT
trả về 5 hàng đầu tiên.Vì có hơn 5 khách hàng không có tín dụng nên kết quả của truy vấn trên có thể dẫn đến kết quả không nhất quán.
Để khắc phục điều này, bạn cần thêm nhiều cột hơn vào ORDER BY
mệnh đề để giới hạn hàng theo thứ tự duy nhất:
SELECT customerNumber, customerName, creditLimit FROM customers ORDER BY creditLimit, customerNumber LIMIT 5;
Kết quả:
Khi bạn 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 hạn chế 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 LIMIT
mệnh đề.
Truy vấn này sử dụng COUNT(*)
hàm tổng hợp để lấy tổng số hàng từ customers
bảng:
SELECT COUNT(*) FROM customers;
Kết quả:
+----------+ | COUNT(*) | +----------+ | 122 | +----------+ 1 row in set (0.00 sec)
Trong ví dụ này, mệnh đề LIMIT 10, 10
trả về 10 hàng cho hàng 11 – 20.
Để lấy giá trị nth cao nhất hoặc thấp nhất LIMIT
n, bạn sử dụng mệnh đề 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;
Kết quả:
Hãy kiểm tra lại 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:
Như vậy bạn có thể thấy rõ ràng 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().
Nếu bạn sử dụng LIMIT
mệnh đề với DISTINCT
mệnh đề, 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 LIMIT
mệnh đề.
Ví dụ sử dụng LIMIT
mệnh đề với DISTINCT
mệnh đề để trả về năm trạng thái duy nhất đầu tiên trong customers
bảng:
SELECT DISTINCT state FROM customers WHERE state IS NOT NULL LIMIT 5;
kết quả:
Bài viết liên quan:
Các bạn có thể xem thêm ở đây: https://www.mysqltutorial.org/mysql-limit.aspx
Bình luận: