- 1 1. Giới thiệu
- 2 2. Cách sử dụng cơ bản của hàm MAX
- 3 3. Lấy giá trị lớn nhất với các điều kiện
- 4 4. Cách lấy giá trị lớn nhất cho mỗi nhóm
- 5 5. Cách truy xuất toàn bộ bản ghi có giá trị tối đa
- 6 6. Các lưu ý quan trọng khi sử dụng hàm MAX
- 7 7. Câu hỏi thường gặp (FAQ)
- 7.1 Q1: Hàm MAX có thể được sử dụng trên nhiều cột cùng một lúc không?
- 7.2 Q2: Điều gì xảy ra khi hàm MAX được áp dụng cho cột kiểu chuỗi?
- 7.3 Q3: Sự khác biệt giữa hàm MAX và mệnh đề ORDER BY là gì?
- 7.4 Q4: Hàm MAX có hoạt động đúng khi bao gồm các giá trị NULL không?
- 7.5 Q5: Làm thế nào để cải thiện hiệu suất khi sử dụng hàm MAX?
- 7.6 Q6: Điều gì xảy ra khi kết hợp MAX với mệnh đề GROUP BY?
- 7.7 Q7: Nếu nhiều bản ghi có cùng giá trị tối đa, làm thế nào để truy xuất tất cả chúng?
- 7.8 Q8: Hàm MAX có thể được sử dụng cùng với các hàm cửa sổ không?
- 8 8. Tóm tắt
1. Giới thiệu
MySQL là một hệ quản trị cơ sở dữ liệu được sử dụng rộng rãi trên toàn thế giới. Trong số nhiều tính năng của nó, hàm MAX là một hàm tổng hợp quan trọng thường được dùng trong phân tích dữ liệu và tạo báo cáo. Khi sử dụng hàm này, bạn có thể dễ dàng lấy giá trị lớn nhất của một cột được chỉ định.
Bài viết này giải thích rõ ràng mọi thứ từ cách sử dụng cơ bản của hàm MAX trong MySQL đến các ví dụ nâng cao và các lưu ý quan trọng. Nó được thiết kế để hữu ích cho cả người mới bắt đầu và người dùng trung cấp, vì vậy hãy sử dụng nó như một tài liệu tham khảo.
2. Cách sử dụng cơ bản của hàm MAX
Hàm MAX có thể được dùng với nhiều kiểu dữ liệu khác nhau, bao gồm giá trị số, ngày tháng và chuỗi. Trong phần này, chúng tôi sẽ giải thích chi tiết cách sử dụng cơ bản.
Cú pháp của hàm MAX
Dưới đây là cú pháp cơ bản của hàm MAX.
SELECT MAX(column_name) FROM table_name;
Sử dụng cú pháp này, bạn có thể lấy giá trị lớn nhất của cột được chỉ định.
Ví dụ: Sử dụng MAX với cột số
Ví dụ sau lấy mức lương cao nhất từ bảng employees.
SELECT MAX(salary) FROM employees;
Ví dụ kết quả:
| MAX(salary) |
|---|
| 120000 |
Kết quả này cho thấy giá trị lớn nhất trong cột salary là 120000.
Ví dụ: Sử dụng MAX với cột ngày
Để lấy ngày tuyển dụng mới nhất của nhân viên, hãy sử dụng truy vấn sau:
SELECT MAX(hire_date) FROM employees;
Ví dụ kết quả:
| MAX(hire_date) |
|---|
| 2025-01-01 |
Kết quả này cho thấy ngày tuyển dụng mới nhất là 2025-01-01.
Ví dụ: Sử dụng MAX với cột chuỗi
Hàm MAX cũng có thể được dùng với các cột chuỗi. Đối với chuỗi, nó trả về giá trị xuất hiện cuối cùng theo thứ tự từ điển (lexicographical).
SELECT MAX(last_name) FROM employees;
Ví dụ kết quả:
| MAX(last_name) |
|---|
| Yamamoto |
Kết quả này cho thấy Yamamoto là tên xuất hiện cuối cùng theo thứ tự chữ cái (lexicographical).
3. Lấy giá trị lớn nhất với các điều kiện
Hàm MAX cũng có thể được dùng kèm các điều kiện. Trong phần này, chúng tôi giải thích cách lấy giá trị lớn nhất dưới các điều kiện cụ thể.
Kết hợp với mệnh đề WHERE
Để lấy giá trị lớn nhất với các điều kiện cụ thể, hãy sử dụng mệnh đề WHERE.
Ví dụ: Lấy mức lương cao nhất trong số các nhân viên có department ID là 10
SELECT MAX(salary) FROM employees WHERE department_id = 10;
Ví dụ kết quả:
| MAX(salary) |
|---|
| 90000 |
Truy vấn này lấy mức lương cao nhất trong số các nhân viên có department ID là 10.
Ví dụ thực tế trong kinh doanh
Bạn có thể sử dụng cùng một cú pháp để lấy chi phí tối đa liên quan đến một dự án cụ thể.
SELECT MAX(cost) FROM projects WHERE project_status = 'active';
Truy vấn này lấy chi phí tối đa trong các dự án có trạng thái active.
4. Cách lấy giá trị lớn nhất cho mỗi nhóm
Bằng cách sử dụng mệnh đề GROUP BY của MySQL, bạn có thể lấy giá trị lớn nhất cho mỗi nhóm. Ví dụ, điều này rất hữu ích khi phân tích dữ liệu theo nhóm, như mức lương cao nhất theo phòng ban hoặc doanh số tối đa theo tháng. Trong phần này, chúng tôi giải thích chi tiết cách lấy giá trị lớn nhất theo nhóm.
Cú pháp cơ bản
Để lấy giá trị lớn nhất cho mỗi nhóm, viết truy vấn như sau:
SELECT grouping_column, MAX(target_column)
FROM table_name
GROUP BY grouping_column;
Với cú pháp này, MySQL sẽ nhóm dữ liệu dựa trên cột được chỉ định và trả về giá trị lớn nhất trong mỗi nhóm.
Ví dụ: Lấy mức lương cao nhất theo phòng ban
Truy vấn sau lấy mức lương cao nhất theo phòng ban từ bảng employees.
SELECT department_id, MAX(salary)
FROM employees
GROUP BY department_id;
Ví dụ kết quả:
| department_id | MAX(salary) |
|---|---|
| 1 | 120000 |
| 2 | 90000 |
| 3 | 80000 |
Kết quả này cho thấy mức lương tối đa (MAX(salary)) cho mỗi phòng ban (department_id).
Ví dụ: Lấy doanh số tối đa theo tháng
Để truy xuất số tiền bán hàng tối đa cho mỗi tháng từ bảng bán hàng, viết truy vấn như sau:
SELECT DATE_FORMAT(sale_date, '%Y-%m') AS sale_month, MAX(amount)
FROM sales
GROUP BY sale_month;
Ví dụ Kết quả:
| sale_month | MAX(amount) |
|---|---|
| 2025-01 | 50000 |
| 2025-02 | 70000 |
| 2025-03 | 60000 |
Trong truy vấn này, cột sale_date được định dạng thành năm-tháng (%Y-%m), và số tiền bán hàng tối đa được truy xuất cho mỗi tháng.
Lưu ý Quan trọng Khi Sử dụng GROUP BY
- Hạn chế về các cột được bao gồm trong câu lệnh SELECT Khi sử dụng mệnh đề
GROUP BY, các cột được bao gồm trong câu lệnhSELECTphải thuộc một trong các trường hợp sau:
- Các cột được chỉ định trong mệnh đề
GROUP BY - Các hàm tổng hợp (ví dụ: MAX, SUM, COUNT, v.v.) Ví dụ: Truy vấn sau sẽ gây ra lỗi.
SELECT department_id, salary FROM employees GROUP BY department_id;
Lý do: salary không được bao gồm trong hàm tổng hợp hoặc mệnh đề GROUP BY.
Xử lý giá trị NULL Nếu cột được nhóm chứa giá trị NULL, các giá trị NULL sẽ được coi là một nhóm riêng. Ví dụ: Các bản ghi có ID phòng ban NULL cũng được tính là một nhóm.
Tối ưu hoá hiệu năng Khi nhóm một lượng lớn dữ liệu, việc sử dụng chỉ mục có thể cải thiện hiệu năng truy vấn. Thêm chỉ mục khi cần.
5. Cách truy xuất toàn bộ bản ghi có giá trị tối đa
Sử dụng hàm MAX của MySQL cho phép bạn truy xuất giá trị tối đa của một cột cụ thể. Tuy nhiên, nó không tự động trả về toàn bộ bản ghi chứa giá trị tối đa đó. Trong phân tích dữ liệu thực tế và các ứng dụng, bạn thường cần không chỉ giá trị tối đa mà còn các thông tin liên quan từ các cột khác.
Trong phần này, chúng tôi sẽ giải thích chi tiết cách truy xuất toàn bộ bản ghi chứa giá trị tối đa.
Phương pháp 1: Sử dụng Subquery
Bạn có thể sử dụng một subquery để truy xuất các bản ghi chứa giá trị tối đa trong một cột cụ thể.
Ví dụ: Truy xuất thông tin cho nhân viên có mức lương cao nhất
SELECT *
FROM employees
WHERE salary = (SELECT MAX(salary) FROM employees);
Ví dụ Kết quả:
| employee_id | name | salary | department_id |
|---|---|---|---|
| 101 | Tanaka | 120000 | 1 |
Cách hoạt động của truy vấn này:
- Subquery
(SELECT MAX(salary) FROM employees)truy xuất mức lương cao nhất. - Truy vấn bên ngoài truy xuất toàn bộ bản ghi khớp với mức lương cao nhất đó.
Phương pháp 2: Sử dụng JOIN
Sử dụng JOIN cho phép bạn tạo các truy vấn linh hoạt hơn.
Ví dụ: Truy xuất nhân viên có mức lương cao nhất theo phòng ban
SELECT e.*
FROM employees e
JOIN (
SELECT department_id, MAX(salary) AS max_salary
FROM employees
GROUP BY department_id
) subquery
ON e.department_id = subquery.department_id
AND e.salary = subquery.max_salary;
Ví dụ Kết quả:
| employee_id | name | salary | department_id |
|---|---|---|---|
| 101 | Tanaka | 120000 | 1 |
| 202 | Suzuki | 90000 | 2 |
Cách hoạt động của truy vấn này:
- Subquery tính mức lương cao nhất cho mỗi phòng ban.
- Truy vấn chính truy xuất toàn bộ bản ghi nhân viên khớp với các mức lương tối đa đó.
Phương pháp 3: Sử dụng Window Functions (MySQL 8.0+)
Trong MySQL 8.0 trở lên, bạn có thể sử dụng window functions để truy xuất các bản ghi có giá trị tối đa một cách ngắn gọn và hiệu quả hơn.
Ví dụ: Truy xuất nhân viên có mức lương cao nhất theo phòng ban
SELECT employee_id, name, salary, department_id
FROM (
SELECT *,
RANK() OVER (PARTITION BY department_id ORDER BY salary DESC) AS rnk
FROM employees
) ranked
WHERE rnk = 1;
Ví dụ Kết quả:
| employee_id | name | salary | department_id |
|---|---|---|---|
| 101 | Tanaka | 120000 | 1 |
| 202 | Suzuki | 90000 | 2 |
Cách hoạt động của truy vấn này:
- Hàm
RANK()xếp hạng mức lương trong mỗi phòng ban theo thứ tự giảm dần. - Truy vấn bên ngoài trích xuất các bản ghi có hạng là 1 (các bản ghi có giá trị tối đa).
Lưu ý Quan trọng
- Nếu có nhiều bản ghi có cùng giá trị tối đa
- Nếu có nhiều bản ghi có cùng giá trị tối đa, tất cả các bản ghi phù hợp sẽ được trả về bằng bất kỳ phương pháp nào. Ví dụ:
SELECT * FROM employees WHERE salary = (SELECT MAX(salary) FROM employees);
Ví dụ Kết quả:
| employee_id | name | salary | department_id |
|---|---|---|---|
| 101 | Tanaka | 120000 | 1 |
| 102 | Sato | 120000 | 1 |
- Tối ưu hoá hiệu năng
- Sử dụng các subquery hoặc JOIN trên các bộ dữ liệu lớn có thể làm giảm hiệu năng.
- Tạo chỉ mục hợp lý có thể cải thiện đáng kể tốc độ thực thi truy vấn.
Ví dụ thực tế trong kinh doanh
- Lấy sản phẩm có giá cao nhất
SELECT * FROM products WHERE price = (SELECT MAX(price) FROM products);
- Lấy thông tin chi tiết của chi phí tối đa cho mỗi dự án
SELECT p.* FROM projects p JOIN ( SELECT project_id, MAX(cost) AS max_cost FROM project_costs GROUP BY project_id ) subquery ON p.project_id = subquery.project_id AND p.cost = subquery.max_cost;
6. Các lưu ý quan trọng khi sử dụng hàm MAX
Hàm MAX của MySQL là một hàm tổng hợp rất hữu ích, nhưng có một số điểm quan trọng cần lưu ý khi sử dụng. Hiểu được đặc điểm dữ liệu, các ảnh hưởng về hiệu năng và cách xử lý giá trị NULL giúp ngăn ngừa kết quả sai và suy giảm hiệu năng. Trong phần này, chúng tôi sẽ giải thích các lưu ý chính khi sử dụng hàm MAX.
Xử lý giá trị NULL
Trong MySQL, các giá trị NULL được coi là “giá trị không xác định”. Do đó, khi sử dụng hàm MAX, các giá trị NULL sẽ bị bỏ qua.
Ví dụ: Lấy giá trị tối đa từ dữ liệu có chứa NULL
SELECT MAX(salary) FROM employees;
Dữ liệu:
| employee_id | name | salary |
|---|---|---|
| 1 | Tanaka | 50000 |
| 2 | Sato | NULL |
| 3 | Suzuki | 60000 |
Kết quả:
| MAX(salary) |
|---|
| 60000 |
Các điểm chính:
- Ngay cả khi cột
salarychứa các giá trị NULL, hàm MAX vẫn sẽ bỏ qua chúng trong quá trình tính toán. - Bạn nên cân nhắc kỹ cách các giá trị NULL ảnh hưởng đến logic dữ liệu của mình.
Khi có nhiều giá trị tối đa
Hàm MAX trả về một giá trị tối đa duy nhất, nhưng trong bộ dữ liệu có thể có nhiều bản ghi chia sẻ cùng một giá trị tối đa. Trong những trường hợp như vậy, bạn cần cấu trúc truy vấn để lấy tất cả các bản ghi phù hợp.
Ví dụ: Lấy các nhân viên có mức lương tối đa giống nhau
SELECT *
FROM employees
WHERE salary = (SELECT MAX(salary) FROM employees);
Dữ liệu:
| employee_id | name | salary |
|---|---|---|
| 1 | Tanaka | 60000 |
| 2 | Sato | 60000 |
| 3 | Suzuki | 50000 |
Kết quả:
| employee_id | name | salary |
|---|---|---|
| 1 | Tanaka | 60000 |
| 2 | Sato | 60000 |
Điểm chính:
- Nếu chỉ dùng hàm MAX không đủ, hãy sử dụng một subquery để lấy tất cả các bản ghi phù hợp.
Ảnh hưởng đến hiệu năng
Hàm MAX hoạt động hiệu quả trong các truy vấn đơn giản. Tuy nhiên, hiệu năng có thể giảm khi làm việc với các bộ dữ liệu lớn hoặc các truy vấn phức tạp.
Mẹo cải thiện hiệu năng
- Sử dụng chỉ mục Thêm một chỉ mục vào cột được dùng trong hàm MAX có thể cải thiện đáng kể tốc độ truy vấn.
CREATE INDEX idx_salary ON employees(salary);
- Lọc dữ liệu không cần thiết Giảm kích thước bộ dữ liệu bằng cách sử dụng mệnh đề WHERE để giới hạn các hàng mục tiêu.
SELECT MAX(salary) FROM employees WHERE department_id = 1;
- Chia và tính toán Xem xét tính giá trị tối đa trong các tập con rồi sau đó xác định giá trị tối đa cuối cùng.
Các lưu ý khác
- Ảnh hưởng của kiểu dữ liệu Hành vi của hàm MAX phụ thuộc vào kiểu dữ liệu của cột.
- Số: So sánh số học đơn giản.
- Chuỗi: So sánh theo thứ tự từ điển.
- Ngày: Trả về ngày gần nhất (mới nhất). Ví dụ:
SELECT MAX(last_name) FROM employees;
Trong trường hợp này, giá trị tối đa được xác định dựa trên thứ tự từ điển của chuỗi.
Dữ liệu thiếu ngoài NULL Nếu dữ liệu không đầy đủ hoặc định dạng không đúng, kết quả tính toán có thể không khớp với mong đợi. Cần thực hiện làm sạch dữ liệu.
Kết hợp với các hàm tổng hợp khác Khi kết hợp hàm MAX với các hàm tổng hợp khác (như SUM hoặc AVG), hãy đảm bảo bạn diễn giải kết quả một cách chính xác.
7. Câu hỏi thường gặp (FAQ)
Phần này tóm tắt và giải thích các câu hỏi thường gặp về hàm MAX của MySQL. Nó bao gồm cả các chủ đề cơ bản và nâng cao.
Q1: Hàm MAX có thể được sử dụng trên nhiều cột cùng một lúc không?
A1: Không, hàm MAX chỉ hoạt động trên một cột duy nhất. Nếu bạn muốn lấy giá trị tối đa của nhiều cột, bạn phải áp dụng hàm MAX cho từng cột một cách riêng biệt.
Ví dụ: Truy xuất các giá trị tối đa từ nhiều cột
SELECT MAX(salary) AS max_salary, MAX(bonus) AS max_bonus
FROM employees;
Q2: Điều gì xảy ra khi hàm MAX được áp dụng cho cột kiểu chuỗi?
A2: Khi được áp dụng cho cột kiểu chuỗi, hàm MAX trả về giá trị cuối cùng theo thứ tự từ điển (lexicographical).
Ví dụ: Truy xuất giá trị chuỗi tối đa
SELECT MAX(last_name) FROM employees;
Các điểm chính:
- Trong thứ tự từ điển, “Z” đứng sau “A”, và các số và ký tự cũng được đánh giá.
- Nếu có ký tự đặc biệt, kết quả có thể không khớp với thứ tự bạn mong đợi.
Q3: Sự khác biệt giữa hàm MAX và mệnh đề ORDER BY là gì?
A3: Mặc dù hàm MAX và mệnh đề ORDER BY có vẻ phục vụ các mục đích tương tự, chúng hoạt động khác nhau.
- Hàm MAX: Truy xuất trực tiếp giá trị tối đa của cột được chỉ định.
- Mệnh đề ORDER BY: Sắp xếp dữ liệu dựa trên cột được chỉ định và cho phép bạn truy xuất giá trị đầu tiên hoặc cuối cùng theo nhu cầu.
Ví dụ: Truy xuất giá trị tối đa bằng ORDER BY
SELECT * FROM employees
ORDER BY salary DESC
LIMIT 1;
Các điểm chính:
- Hàm MAX thường hiệu quả hơn về hiệu suất.
- Mệnh đề ORDER BY hữu ích khi bạn cần thông tin bổ sung cùng với bản ghi chứa giá trị tối đa.
Q4: Hàm MAX có hoạt động đúng khi bao gồm các giá trị NULL không?
A4: Có, hàm MAX bỏ qua các giá trị NULL. Do đó, các giá trị NULL không ảnh hưởng đến việc tính toán giá trị tối đa.
Ví dụ: Hành vi khi bao gồm các giá trị NULL
SELECT MAX(salary) FROM employees;
Dữ liệu:
| employee_id | name | salary |
|---|---|---|
| 1 | Tanaka | 60000 |
| 2 | Sato | NULL |
| 3 | Suzuki | 50000 |
Kết quả:
| MAX(salary) |
|---|
| 60000 |
Lưu ý quan trọng:
Nếu bạn muốn bao gồm các giá trị NULL trong quá trình xử lý, hãy sử dụng hàm IFNULL để thay thế NULL bằng một giá trị mặc định.
SELECT MAX(IFNULL(salary, 0)) FROM employees;
Q5: Làm thế nào để cải thiện hiệu suất khi sử dụng hàm MAX?
A5: Xem xét các cách tiếp cận sau:
- Thêm chỉ mục: Thêm một chỉ mục vào cột được sử dụng trong hàm MAX có thể cải thiện đáng kể hiệu suất truy vấn.
CREATE INDEX idx_salary ON employees(salary);
- Lọc dữ liệu mục tiêu: Sử dụng mệnh đề WHERE để giảm số lượng hàng được xử lý.
SELECT MAX(salary) FROM employees WHERE department_id = 1;
- Tối ưu hóa truy vấn: Loại bỏ các phép tính không cần thiết và giữ cấu trúc truy vấn đơn giản.
Q6: Điều gì xảy ra khi kết hợp MAX với mệnh đề GROUP BY?
A6: Khi kết hợp GROUP BY với hàm MAX, bạn có thể truy xuất giá trị tối đa cho mỗi nhóm.
Ví dụ: Truy xuất mức lương cao nhất theo phòng ban
SELECT department_id, MAX(salary)
FROM employees
GROUP BY department_id;
Kết quả:
| department_id | MAX(salary) |
|---|---|
| 1 | 120000 |
| 2 | 90000 |
Q7: Nếu nhiều bản ghi có cùng giá trị tối đa, làm thế nào để truy xuất tất cả chúng?
A7: Sử dụng subquery hoặc JOIN để truy xuất tất cả các bản ghi có cùng giá trị tối đa.
Ví dụ: Truy xuất tất cả các bản ghi có giá trị tối đa
SELECT *
FROM employees
WHERE salary = (SELECT MAX(salary) FROM employees);
Q8: Hàm MAX có thể được sử dụng cùng với các hàm cửa sổ không?
A8: Có, trong MySQL 8.0 và các phiên bản sau, bạn có thể kết hợp MAX với các hàm cửa sổ để có các truy vấn linh hoạt hơn.
Ví dụ: Truy xuất nhân viên có mức lương cao nhất theo phòng ban
SELECT employee_id, name, salary, department_id
FROM (
SELECT *,
RANK() OVER (PARTITION BY department_id ORDER BY salary DESC) AS rnk
FROM employees
) ranked
WHERE rnk = 1;

8. Tóm tắt
Hàm MAX của MySQL là một công cụ mạnh mẽ cho các hoạt động cơ sở dữ liệu và phân tích dữ liệu. Trong bài viết này, chúng tôi đã bao quát toàn diện mọi thứ từ việc sử dụng cơ bản của hàm MAX đến các truy vấn có điều kiện, nhóm, truy xuất toàn bộ bản ghi có giá trị tối đa, và tối ưu hóa hiệu suất.
Những điểm chính
- Sử dụng cơ bản của hàm MAX Hàm MAX được sử dụng để lấy giá trị lớn nhất của một cột được chỉ định. Nó hỗ trợ các loại dữ liệu khác nhau, bao gồm số, chuỗi và ngày tháng.
- Lấy giá trị lớn nhất có điều kiện Bằng cách sử dụng mệnh đề
WHERE, bạn có thể lấy các giá trị lớn nhất phù hợp với các điều kiện cụ thể. Điều này hữu ích cho phân tích dựa trên dự án hoặc bộ phận. - Lấy giá trị lớn nhất theo nhóm Chúng tôi đã giải thích cách sử dụng mệnh đề
GROUP BYđể lấy giá trị lớn nhất cho mỗi nhóm, chẳng hạn như lương theo bộ phận hoặc doanh số theo tháng. - Lấy toàn bộ bản ghi có giá trị lớn nhất Bạn đã học cách lấy hiệu quả các bản ghi đầy đủ chứa giá trị lớn nhất bằng cách sử dụng truy vấn con, JOIN và hàm cửa sổ.
- Những lưu ý quan trọng khi sử dụng MAX Điều quan trọng là phải xem xét xử lý NULL, nhiều giá trị lớn nhất và tác động đến hiệu suất.
- Câu hỏi thường gặp Chúng tôi đã trả lời các câu hỏi phổ biến, bao gồm cách sử dụng MAX với nhiều cột và mẹo tối ưu hóa hiệu suất.
Những suy nghĩ cuối cùng
Bằng cách sử dụng đúng cách hàm MAX, phân tích dữ liệu và báo cáo trở nên hiệu quả hơn nhiều. Hãy tiếp tục thực hành SQL để xây dựng các truy vấn nâng cao hơn.
Chúng tôi hy vọng bài viết này giúp bạn hiểu sâu hơn về thao tác và phân tích dữ liệu sử dụng MySQL.


