Phương pháp: ORDER BY + LIMIT
Sắp xếp giảm dần theo cột ID và lấy 1 hàng đầu tiên:
SELECT * FROM ten_bang ORDER BY ten_cot_id DESC LIMIT 1 OFFSET 0;
Ví dụ chi tiết
1. Tạo bảng
mysql> CREATE TABLE HighestIdOrderBy ( -> EmployeeId INT, -> EmployeeName VARCHAR(200) -> ); Query OK, 0 rows affected (0.58 sec)
2. Chèn dữ liệu
mysql> INSERT INTO HighestIdOrderBy VALUES(200,'David'); Query OK, 1 row affected (0.20 sec) mysql> INSERT INTO HighestIdOrderBy VALUES(1000,'Bob'); Query OK, 1 row affected (0.18 sec) mysql> INSERT INTO HighestIdOrderBy VALUES(600,'John'); Query OK, 1 row affected (0.16 sec) mysql> INSERT INTO HighestIdOrderBy VALUES(300,'Johnson'); Query OK, 1 row affected (0.18 sec) mysql> INSERT INTO HighestIdOrderBy VALUES(100,'Carol'); Query OK, 1 row affected (0.12 sec)
3. Dữ liệu ban đầu
mysql> SELECT * FROM HighestIdOrderBy;
+------------+--------------+ | EmployeeId | EmployeeName | +------------+--------------+ | 200 | David | | 1000 | Bob | | 600 | John | | 300 | Johnson | | 100 | Carol | +------------+--------------+ 5 rows in set (0.00 sec)
4. Truy vấn ID lớn nhất
mysql> SELECT * FROM HighestIdOrderBy ORDER BY EmployeeId DESC LIMIT 1 OFFSET 0;
+------------+--------------+ | EmployeeId | EmployeeName | +------------+--------------+ | 1000 | Bob | +------------+--------------+ 1 row in set (0.00 sec)
Các phương pháp thay thế
Sử dụng MAX() - Chỉ lấy giá trị ID
SELECT MAX(EmployeeId) FROM HighestIdOrderBy;
Subquery - Lấy toàn bộ hàng
SELECT * FROM HighestIdOrderBy WHERE EmployeeId = (SELECT MAX(EmployeeId) FROM HighestIdOrderBy);
So sánh hiệu năng
| Phương pháp | Ưu điểm | Nhược điểm |
|---|---|---|
| ORDER BY ... LIMIT 1 | Đơn giản, lấy toàn bộ hàng | Quét index nếu không có index trên cột ID |
| MAX() | Rất nhanh với index | Chỉ trả về giá trị ID, không phải hàng hoàn chỉnh |
| Subquery với MAX() | Lấy hàng hoàn chỉnh, tận dụng index | Cú pháp phức tạp hơn |
Khuyến nghị
Nên tạo index cho cột ID (thường là PRIMARY KEY) để tối ưu hiệu năng cho cả hai phương pháp.