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

shell
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_idfirst_namelast_namedepartmentsalary
1JohnDoeSales1500000
2JaneSmithMarketing1700000
3BobJohnsonSales1300000
4AliceBrownHR2000000
5CharlieGreenMarketing1800000

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

shell
SELECT department, COUNT(employee_id) AS total_employees
FROM employees
GROUP BY department;

Kết quả:

departmenttotal_employees
Sales2
Marketing2
HR1

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

shell
SELECT department, SUM(salary) AS total_salary
FROM employees
GROUP BY department;

Kết quả:

departmenttotal_salary
Sales2800000
Marketing3500000
HR2000000

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

shell
SELECT department, AVG(salary) AS avg_salary
FROM employees
GROUP BY department;

Kết quả:

departmentavg_salary
Sales1400000
Marketing1750000
HR2000000

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 MAXMIN

Bạn cũng có thể sử dụng MAX()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

shell
SELECT department, MAX(salary) AS max_salary, MIN(salary) AS min_salary
FROM employees
GROUP BY department;

Kết quả:

departmentmax_salarymin_salary
Sales15000001300000
Marketing18000001700000
HR20000002000000

Trong ví dụ này, MAX(salary)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

shell
SELECT department, SUM(salary) AS total_salary
FROM employees
GROUP BY department
HAVING SUM(salary) > 3000000;

Kết quả:

departmenttotal_salary
Marketing3500000

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

shell
SELECT department, last_name, COUNT(employee_id) AS num_employees
FROM employees
GROUP BY department, last_name;

Kết quả:

departmentlast_namenum_employees
SalesDoe1
SalesJohnson1
MarketingSmith1
MarketingGreen1
HRBrown1

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

shell
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

shell
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

shell
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ụ:

shell
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!