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 SELECTcâ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 LIMITcú 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_countchỉ định số lượng hàng tối đa để trả về.Hình ảnh sau đây minh họa LIMITmệnh đề:

Khi bạn sử dụng LIMITmệ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 LIMITcú pháp mệnh đề thay thế sau:
LIMIT row_count OFFSET offset
Theo mặc định, SELECTcâu lệnh trả về các hàng theo thứ tự không xác định. Khi bạn thêm LIMITmệnh đề vào SELECTcâu lệnh, các hàng được trả về sẽ không thể đoán trước.
Do đó, để đảm bảo LIMITmệnh đề trả về kết quả như mong đợi, bạn phải luôn sử dụng nó với một ORDER BYmệ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 customersbảng từ cơ sở dữ liệu mẫu để lấy ví dụ.

Câu lệnh này sử dụng LIMITmệ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 LIMITmệ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 BYmệ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 LIMITmệnh đề.
Truy vấn này sử dụng COUNT(*) hàm tổng hợp để lấy tổng số hàng từ customersbả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, 10trả 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 LIMITmệ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 LIMITmệnh đề.
Ví dụ sử dụng LIMITmệnh đề với DISTINCTmệnh đề để trả về năm trạng thái duy nhất đầu tiên trong customersbả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: