1. Mệnh đề Limit là gì?
Mệnh đề LIMIT được sử dụng để hạn chế số lượng hàng (rows) được trả về bởi câu lệnh SELECT. Tính năng này rất hữu ích để tối ưu hóa thời gian tải trang cũng như nâng cao khả năng đọc của trang web. Ví dụ: bạn có thể chia số lượng lớn bản ghi trong nhiều trang bằng cách sử dụng phân trang, trong đó số lượng bản ghi giới hạn sẽ được tải trên mọi trang từ cơ sở dữ liệu khi người dùng yêu cầu trang đó bằng cách nhấp vào liên kết phân trang.
Mệnh đề LIMIT giúp dễ dàng viết mã các kết quả nhiều trang hoặc phân trang bằng SQL và rất hữu ích trên các bảng lớn. Trả lại một số lượng lớn bản ghi có thể ảnh hưởng đến hiệu suất. Mặc định thì tất cả các kết quả của câu truy vấn sẽ được trả về. Tuy nhiên đôi khi ta muốn lấy một số tập hợp nhỏ (một khoảng) của kết quả thôi. Lúc đó có thể dùng LITMIT hỗ trợ trong MySQL, SQLite …
Cú pháp cơ bản của mệnh đề Limit:
SELECT column_name(s) FROM table_name LIMIT row_offset, row_count;
Cú pháp Limit với 2 đối số:
SELECT colum1. colum2,... FROM table_name WHERE (expr|colum_1) IN ('value1','value2',...);
Mệnh đề Limit chấp nhận một hoặc hai thông số này phải là một số nguyên dương:
- Khi hai tham số được chỉ định, tham số đầu tiên chỉ định độ lệch của hàng đầu tiên trả về tức là điểm bắt đầu, trong khi tham số thứ hai chỉ định số lượng hàng sẽ trả về. Phần bù của hàng đầu tiên là 0 (không phải 1).
- Trong khi đó, khi chỉ có một tham số được cung cấp, nó chỉ định số hàng tối đa để trả về từ đầu tập kết quả.
Ví dụ: để truy xuất ba hàng đầu tiên, bạn có thể sử dụng truy vấn sau:
SELECT * FROM persons LIMIT 3;
Để truy xuất các hàng 2-4 (bao gồm) của một tập hợp kết quả, bạn có thể sử dụng truy vấn sau:
SELECT * FROM persons LIMIT 1, 3;
2. Sử dụng câu lệnh Limit
2.1. Sử dụng lệnh Limit trong MySQL để có được N hàng đầu tiên
Bạn có thể sử dụng lệnh LIMIT để chọn N hàng đầu tiên trong một bảng như sau:
SELECT colum1, colum2,... FORM table LIMIT N;
Ví dụ: để chọn 5 nhân viên đầu tiên trong bảng demo, bạn sử dụng truy vấn sau:
SELECT First_name, Last_name, address FORM demo LIMIT 5
2.2. Sử dụng lệnh Limit để nhận được giá trị cao nhất và thấp nhất
Câu lệnh LIMIT thường được sử dụng với câu lệnh ORDER BY. Trước tiên, bạn sử dụng mệnh đề ORDER BY để sắp xếp tập kết quả trả về dựa trên các tiêu chí nhất định, và sau đó bạn sử dụng mệnh đề LIMIT để tìm các giá trị thấp nhất hoặc cao nhất.
Ví dụ sau sẽ lấy ra 5 sản phẩm có giá từ cao xuống thấp:
SELECT ten_sp, anh_sp, gia_sp FORM sanpham ODER BY gia_sp DESC LIMIT 5
2.3. Sử dụng lệnh Limit để nhận giá trị cao nhất thứ N
Một trong những câu hỏi khó nhất trong MySQL là cách chọn giá trị cao thứ n trong tập kết quả, ví dụ, chọn sản phẩm đắt thứ hai (hoặc thứ n), bạn không thể sử dụng hàm MAX hoặc MIN để trả lời. Tuy nhiên, bạn có thể sử dụng MySQL LIMIT để trả lời các loại câu hỏi đó.
- Đầu tiên, bạn sắp xếp tập hợp kết quả theo thứ tự giảm dần.
- Thứ hai, bạn sử dụng mệnh đề LIMIT để có được sản phẩm đắt thứ n.
Câu truy vấn chung là:
SELECT colum1, colum2,... FORM table ODER By colum1 DESC LIMIT nth-1, count;
3. Sử dụng Limit với MySQLi
Hãy xem xét bảng person sau trong cơ sở dữ liệu demo
Id | First_name | Last_name | |
1 | Thành | Nguyễn | Thanh@gmail.com |
2 | Nam | Chu | Nam@gmail.com |
3 | Sơn | Phùng | Son@gmail.com |
4 | Lập trình | Từ đầu | Laptrinhtudau.com |
3.1. Sử dụng Limit với MySQLi hướng thủ tục
<?php /* Cố gắng kết nối MySQL Servwer. Giả sử bạn đang chạy MySQL server với thiết lập mặc định (user 'root' và không có mật khẩu) */ $link = mysqli_connect("localhost", "root", "", "demo"); // Kiểm tra kết nối if($link === false){ die("ERROR: Không thể kết nối. " . mysqli_connect_error()); } // Cố gắng thực hiện truy vấn $sql = "SELECT * FROM persons LIMIT 3"; if($result = mysqli_query($link, $sql)){ if(mysqli_num_rows($result) > 0){ echo "<table>"; echo "<tr>"; echo "<th>id</th>"; echo "<th>first_name</th>"; echo "<th>last_name</th>"; echo "<th>email</th>"; echo "</tr>"; while($row = mysqli_fetch_array($result)){ echo "<tr>"; echo "<td>" . $row['id'] . "</td>"; echo "<td>" . $row['first_name'] . "</td>"; echo "<td>" . $row['last_name'] . "</td>"; echo "<td>" . $row['email'] . "</td>"; echo "</tr>"; } echo "</table>"; // Giải phóng bộ nhớ của biến mysqli_free_result($result); } else{ echo "Không có bản ghi nào được tìm thấy."; } } else{ echo "ERROR: Không thể thực thi $sql. " . mysqli_error($link); } // Đóng kết nối mysqli_close($link); ?>
3.2. Sử dụng Limit với MySQLi hướng đối tượng
<?php /* Cố gắng kết nối MySQL Servwer. Giả sử bạn đang chạy MySQL server với thiết lập mặc định (user 'root' và không có mật khẩu) */ $mysqli = new mysqli("localhost", "root", "", "demo"); // Kiểm tra kết nối if($mysqli === false){ die("ERROR: Không thể kết nối. " . $mysqli->connect_error); } // Cố gắng thực thi truy vấn $sql = "SELECT * FROM persons LIMIT 3"; if($result = $mysqli->query($sql)){ if($result->num_rows > 0){ echo "<table>"; echo "<tr>"; echo "<th>id</th>"; echo "<th>first_name</th>"; echo "<th>last_name</th>"; echo "<th>email</th>"; echo "</tr>"; while($row = $result->fetch_array()){ echo "<tr>"; echo "<td>" . $row['id'] . "</td>"; echo "<td>" . $row['first_name'] . "</td>"; echo "<td>" . $row['last_name'] . "</td>"; echo "<td>" . $row['email'] . "</td>"; echo "</tr>"; } echo "</table>"; // Giải phóng bộ nhớ của biến $result->free(); } else{ echo "Không có bản ghi nào được tìm thấy."; } } else{ echo "ERROR: Không thể thực thi $sql. " . $mysqli->error; } // Đóng kết nối $mysqli->close(); ?>
4. Sử dụng Limit với PDO
<?php /* Cố gắng kết nối MySQL Servwer. Giả sử bạn đang chạy MySQL server với thiết lập mặc định (user 'root' và không có mật khẩu) */ try{ $pdo = new PDO("mysql:host=localhost;dbname=demo", "root", ""); // Thiết lập chế độ PDO error thành Ngoại lệ $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch(PDOException $e){ die("ERROR: Không thể kết nối. " . $e->getMessage()); } // Cố gắng thực thi truy vấn try{ $sql = "SELECT * FROM persons LIMIT 3"; $result = $pdo->query($sql); if($result->rowCount() > 0){ echo "<table>"; echo "<tr>"; echo "<th>id</th>"; echo "<th>first_name</th>"; echo "<th>last_name</th>"; echo "<th>email</th>"; echo "</tr>"; while($row = $result->fetch()){ echo "<tr>"; echo "<td>" . $row['id'] . "</td>"; echo "<td>" . $row['first_name'] . "</td>"; echo "<td>" . $row['last_name'] . "</td>"; echo "<td>" . $row['email'] . "</td>"; echo "</tr>"; } echo "</table>"; // Giải phóng bộ nhớ của biến unset($result); } else{ echo "Không có bản ghi nào được tìm thấy."; } } catch(PDOException $e){ die("ERROR: Không thể thực thi $sql. " . $e->getMessage()); } // Đóng kết nối unset($pdo); ?>
Kết quả khi sử dụng Limit với các ví dụ trên đều giới hạn bản ghi trả về. Và nếu các bạn để ý thì ở ví dụ những bài gần đây thì mình chỉ cần thay đổi câu lệnh truy vấn SQL còn các câu lệnh khác mình vẫn giữ y nguyên.