Vấn đề: Tìm tuổi cao nhất cho mỗi tên học sinh (có nhiều hàng cùng tên)
Giải pháp: GROUP BY StudentName + MAX(StudentAge)
1. Tạo bảng và dữ liệu
CREATE TABLE DemoTable (
StudentName VARCHAR(20),
StudentAge INT
);
INSERT INTO DemoTable VALUES
('Chris', 23), ('David', 34), ('Chris', 27),
('Sam', 31), ('David', 32), ('David', 37);
2. Dữ liệu gốc
+-------------+------------+
| StudentName | StudentAge |
+-------------+------------+
| Chris | 23 |
| David | 34 |
| Chris | 27 |
| Sam | 31 |
| David | 32 |
| David | 37 |
+-------------+------------+
3. Truy vấn
SELECT StudentName, MAX(StudentAge) AS MaxAge
FROM DemoTable
GROUP BY StudentName;
4. Kết quả
+-------------+--------+
| StudentName | MaxAge |
+-------------+--------+
| Chris | 27 |
| David | 37 |
| Sam | 31 |
+-------------+--------+
Giải thích
GROUP BY StudentName– Gom hàng theo tên.MAX(StudentAge)– Hàm tổng hợp lấy giá trị lớn nhất trong nhóm.
Mở rộng: Lấy cả hàng hoàn chỉnh (không chỉ MAX)
Nếu cần toàn bộ thông tin của hàng có tuổi max (ví dụ cả StudentId):
-- MySQL 8.0+ Window Function
WITH Ranked AS (
SELECT *, ROW_NUMBER() OVER (PARTITION BY StudentName ORDER BY StudentAge DESC) AS rn
FROM DemoTable
)
SELECT * FROM Ranked WHERE rn = 1;
Lưu ý
- Index trên
(StudentName, StudentAge)tối ưu cho GROUP BY + MAX. - Nếu có nhiều học sinh trùng tên khác người – nên dùng StudentId làm khóa chính, không GROUP BY Name.