1. Giới thiệu
Câu lệnh GROUP BY trong MySQL được sử dụng để nhóm các hàng có cùng một giá trị lại với nhau. Sau khi nhóm các hàng lại, bạn có thể sử dụng các hàm tổng hợp như COUNT(), SUM(), AVG(), MIN(), MAX() để tính toán các giá trị tổng hợp cho mỗi nhóm.
GROUP BY rất hữu ích trong việc phân tích và tổng hợp dữ liệu, giúp bạn có thể lấy các kết quả phân tích theo từng nhóm riêng biệt, chẳng hạn như tính tổng doanh thu theo từng phòng ban, hoặc đếm số lượng nhân viên trong từng nhóm.
2. Cú pháp của MySQL GROUP BY
SELECT column1, column2, ..., AGGREGATE_FUNCTION(column_name)
FROM table_name
WHERE condition
GROUP BY column1, column2, ...;column1, column2: Các cột mà bạn muốn nhóm dữ liệu theo.AGGREGATE_FUNCTION(column_name): Hàm tổng hợp (ví dụ:COUNT(),SUM(),AVG()) áp dụng cho từng nhóm.table_name: Tên của bảng chứa dữ liệu.condition: Điều kiện để lọc dữ liệu (tùy chọn).
3. Bảng dữ liệu giả định
Giả sử chúng ta có bảng employees với các thông tin như sau:
| employee_id | first_name | last_name | department | salary |
|---|---|---|---|---|
| 1 | John | Doe | Sales | 1500000 |
| 2 | Jane | Smith | Marketing | 1700000 |
| 3 | Bob | Johnson | Sales | 1300000 |
| 4 | Alice | Brown | HR | 2000000 |
| 5 | Charlie | Green | Marketing | 1800000 |
4. Cách sử dụng GROUP BY trong MySQL
a. Sử dụng GROUP BY để đếm số lượng bản ghi trong mỗi nhóm
COUNT() là một hàm tổng hợp được sử dụng để đếm số lượng bản ghi trong mỗi nhóm.
Ví dụ 1: Đếm số lượng nhân viên trong mỗi phòng ban
SELECT department, COUNT(employee_id) AS total_employees
FROM employees
GROUP BY department;Kết quả:
| department | total_employees |
|---|---|
| Sales | 2 |
| Marketing | 2 |
| HR | 1 |
Trong ví dụ này, GROUP BY department sẽ nhóm các nhân viên theo từng phòng ban và đếm số lượng nhân viên trong mỗi phòng ban bằng cách sử dụng hàm COUNT().
b. Sử dụng GROUP BY với hàm SUM để tính tổng giá trị
Hàm SUM() được sử dụng để tính tổng giá trị cho mỗi nhóm.
Ví dụ 2: Tính tổng lương của nhân viên trong mỗi phòng ban
SELECT department, SUM(salary) AS total_salary
FROM employees
GROUP BY department;Kết quả:
| department | total_salary |
|---|---|
| Sales | 2800000 |
| Marketing | 3500000 |
| HR | 2000000 |
Trong ví dụ này, GROUP BY department sẽ nhóm các nhân viên theo từng phòng ban, và SUM(salary) sẽ tính tổng lương của các nhân viên trong mỗi phòng ban.
c. Sử dụng GROUP BY với hàm AVG để tính giá trị trung bình
Hàm AVG() được sử dụng để tính giá trị trung bình cho mỗi nhóm.
Ví dụ 3: Tính lương trung bình của nhân viên trong mỗi phòng ban
SELECT department, AVG(salary) AS avg_salary
FROM employees
GROUP BY department;Kết quả:
| department | avg_salary |
|---|---|
| Sales | 1400000 |
| Marketing | 1750000 |
| HR | 2000000 |
Trong ví dụ này, GROUP BY department sẽ nhóm các nhân viên theo từng phòng ban, và AVG(salary) sẽ tính lương trung bình của các nhân viên trong mỗi phòng ban.
d. Sử dụng GROUP BY với hàm MAX và MIN
Bạn cũng có thể sử dụng MAX() và MIN() để tìm giá trị lớn nhất và nhỏ nhất trong mỗi nhóm.
Ví dụ 4: Tìm mức lương cao nhất và thấp nhất trong mỗi phòng ban
SELECT department, MAX(salary) AS max_salary, MIN(salary) AS min_salary
FROM employees
GROUP BY department;Kết quả:
| department | max_salary | min_salary |
|---|---|---|
| Sales | 1500000 | 1300000 |
| Marketing | 1800000 | 1700000 |
| HR | 2000000 | 2000000 |
Trong ví dụ này, MAX(salary) và MIN(salary) giúp bạn tìm ra mức lương cao nhất và thấp nhất của nhân viên trong mỗi phòng ban.
5. Sử dụng GROUP BY với điều kiện HAVING
Câu lệnh HAVING được sử dụng để lọc kết quả sau khi các nhóm đã được tạo ra. Điều này tương tự như WHERE, nhưng HAVING được áp dụng sau khi dữ liệu đã được nhóm lại.
Ví dụ 5: Tìm các phòng ban có tổng lương lớn hơn 3,000,000
SELECT department, SUM(salary) AS total_salary
FROM employees
GROUP BY department
HAVING SUM(salary) > 3000000;Kết quả:
| department | total_salary |
|---|---|
| Marketing | 3500000 |
Trong ví dụ này, HAVING giúp lọc ra chỉ các phòng ban có tổng lương lớn hơn 3,000,000.
6. Sử dụng GROUP BY với nhiều cột
Bạn có thể sử dụng GROUP BY với nhiều cột để tạo nhóm con.
Ví dụ 6: Nhóm theo phòng ban và họ của nhân viên
SELECT department, last_name, COUNT(employee_id) AS num_employees
FROM employees
GROUP BY department, last_name;Kết quả:
| department | last_name | num_employees |
|---|---|---|
| Sales | Doe | 1 |
| Sales | Johnson | 1 |
| Marketing | Smith | 1 |
| Marketing | Green | 1 |
| HR | Brown | 1 |
Trong ví dụ này, GROUP BY department, last_name giúp nhóm dữ liệu dựa trên cả phòng ban và họ của nhân viên.
7. Các ví dụ khác về GROUP BY trong MySQL
Ví dụ 1: Đếm số lượng nhân viên theo từng phòng ban và lương trung bình
SELECT department, COUNT(employee_id) AS total_employees, AVG(salary) AS avg_salary
FROM employees
GROUP BY department;Ví dụ 2: Tìm tổng lương và lương trung bình của các phòng ban có tổng lương lớn hơn 2,500,000
SELECT department, SUM(salary) AS total_salary, AVG(salary) AS avg_salary
FROM employees
GROUP BY department
HAVING SUM(salary) > 2500000;Ví dụ 3: Nhóm các nhân viên theo phòng ban và tính lương trung bình cho từng nhóm
SELECT department, AVG(salary) AS avg_salary
FROM employees
GROUP BY department;8. Một số lưu ý khi sử dụng GROUP BY
a. Cột không nằm trong hàm tổng hợp phải nằm trong GROUP BY
Mọi cột không nằm trong các hàm tổng hợp như COUNT(), SUM(), AVG(),... đều phải nằm trong câu lệnh GROUP BY.
Ví dụ:
SELECT department, last_name, COUNT(employee_id)
FROM employees
GROUP BY department, last_name;b. Sử dụng HAVING thay cho WHERE khi lọc kết quả nhóm
Trong khi WHERE được sử dụng để lọc các hàng trước khi dữ liệu được nhóm lại, HAVING được sử dụng để lọc kết quả sau khi dữ liệu đã được nhóm.
c. Hiệu suất của GROUP BY
Sử dụng GROUP BY trên các bảng lớn có thể ảnh hưởng đến hiệu suất truy vấn. Bạn có thể cải thiện hiệu suất bằng cách tạo chỉ mục (index) cho các cột được nhóm.
Kết luận
SQL GROUP BY là một công cụ mạnh mẽ giúp bạn phân tích dữ liệu bằng cách nhóm các hàng có cùng giá trị lại với nhau và sử dụng các hàm tổng hợp để tính toán. Bạn có thể sử dụng GROUP BY để đếm số lượng bản ghi, tính tổng, giá trị trung bình, hoặc tìm giá trị lớn nhất và nhỏ nhất trong mỗi nhóm. Kết hợp với HAVING, GROUP BY giúp bạn dễ dàng lọc và phân tích dữ liệu theo nhu cầu.
Hãy thử áp dụng các ví dụ này vào các bài tập và dự án thực tế trên CodeTutHub để nắm vững hơn về cách sử dụng GROUP BY trong MySQL!









