Để tìm bản ghi có giá trị lớn nhất trên một cột số, MySQL dùng hàm tập hợp MAX() kết hợp với subquery hoặc ORDER BY ... LIMIT 1.
Ví dụ minh họa
Tạo bảng điểm người chơi:
mysql> CREATE TABLE DemoTable1449 (
PlayerId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
PlayerScore INT
);
Chèn dữ liệu:
mysql> INSERT INTO DemoTable1449 (PlayerScore) VALUES (1040); mysql> INSERT INTO DemoTable1449 (PlayerScore) VALUES (1450); mysql> INSERT INTO DemoTable1449 (PlayerScore) VALUES (1890); mysql> INSERT INTO DemoTable1449 (PlayerScore) VALUES (1650);
Dữ liệu:
mysql> SELECT * FROM DemoTable1449;
+----------+-------------+ | PlayerId | PlayerScore | +----------+-------------+ | 1 | 1040 | | 2 | 1450 | | 3 | 1890 | | 4 | 1650 | +----------+-------------+
Cách 1: Subquery với MAX() (chuẩn SQL, trả về tất cả hàng có max)
mysql> SELECT PlayerId, PlayerScore
FROM DemoTable1449
WHERE PlayerScore = (SELECT MAX(PlayerScore) FROM DemoTable1449);
Kết quả:
+----------+-------------+ | PlayerId | PlayerScore | +----------+-------------+ | 3 | 1890 | +----------+-------------+
Cách 2: ORDER BY DESC LIMIT 1 (nhanh hơn, trả về 1 hàng)
mysql> SELECT PlayerId, PlayerScore
FROM DemoTable1449
ORDER BY PlayerScore DESC
LIMIT 1;
Kết quả tương tự.
So sánh 2 cách
| Tiêu chí | Subquery MAX() | ORDER BY LIMIT 1 |
|---|---|---|
| Trả về | Tất cả hàng có giá trị max (nếu tie) | Chỉ 1 hàng (tie-break tùy ORDER BY phụ) |
| Hiệu năng | 2 lần quét (hoặc optimize bằng index) | 1 lần quét + sort (hoặc index scan) |
| Index | Tận dụng index trên PlayerScore | Tận dụng index trên PlayerScore |
| Chuẩn SQL | ✅ | ✅ (LIMIT là MySQL/PostgreSQL) |
Mở rộng: Tìm Top N