Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Lấy tuổi lớn nhất theo từng học sinh (GROUP BY + MAX) trong MySQL

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.