MySQL - Câu lệnh GROUP BY: Hướng dẫn cho người mới bắt đầu

Xin chào các pháp sư cơ sở dữ liệu tương lai! Hôm nay, chúng ta sẽ bắt đầu một hành trình đầy thú vị vào thế giới của câu lệnh GROUP BY trong MySQL. Đừng lo lắng nếu bạn chưa từng viết một dòng mã trước đây - tôi sẽ là người hướng dẫn thân thiện của bạn, và chúng ta sẽ cùng nhau bước từng bước. Cuối cùng của bài hướng dẫn này, bạn sẽ biết cách nhóm dữ liệu như một chuyên gia!

MySQL - Group By Clause

Câu lệnh GROUP BY trong MySQL là gì?

Hãy tưởng tượng bạn đang tổ chức một thư viện khổng lồ. Bạn sẽ không chỉ đơn giản là đặt tất cả các sách lên một kệ, phải không? Bạn sẽ nhóm chúng theo thể loại, tác giả hoặc năm xuất bản. Đó chính xác là điều mà câu lệnh GROUP BY làm cho dữ liệu của chúng ta - nó giúp chúng ta tổ chức và tóm tắt thông tin một cách có ý nghĩa.

Câu lệnh GROUP BY được sử dụng trong các truy vấn SQL để nhóm các hàng có cùng giá trị trong các cột được chỉ định. Nó thường được sử dụng cùng với các hàm tổng hợp như COUNT(), MAX(), MIN(), SUM(), AVG() để thực hiện các phép toán trên mỗi nhóm hàng.

Hãy cùng xem một số ví dụ để hiểu rõ hơn!

MySQL GROUP BY trên một cột

Chúng ta sẽ bắt đầu với một ví dụ đơn giản. Giả sử chúng ta có một bảng叫做 employees với các cột employee_id, name, department, và salary. Chúng ta muốn biết có bao nhiêu nhân viên trong mỗi phòng ban.

Dưới đây là cách chúng ta làm điều đó:

SELECT department, COUNT(*) AS employee_count
FROM employees
GROUP BY department;

Truy vấn này sẽ cho chúng ta kết quả như sau:

department employee_count
Sales 10
Marketing 5
IT 8

Hãy phân tích những gì đang xảy ra ở đây:

  1. Chúng ta SELECT cột department và sử dụng hàm COUNT(*) để đếm các hàng.
  2. Chúng ta đặt tên thân thiện cho số đếm với AS employee_count.
  3. Câu lệnh GROUP BY nhóm kết quả theo department.

Kết quả hiển thị cho chúng ta biết số lượng nhân viên trong mỗi phòng ban. Đẹp phải không?

MySQL GROUP BY trên nhiều cột

Bây giờ, hãy nâng cấp một chút. Nếu chúng ta muốn nhóm theo nhiều hơn một cột? Không có vấn đề! Giả sử bảng employees của chúng ta cũng có cột job_title, và chúng ta muốn biết có bao nhiêu nhân viên có mỗi chức danh công việc trong mỗi phòng ban.

Dưới đây là cách chúng ta làm điều đó:

SELECT department, job_title, COUNT(*) AS employee_count
FROM employees
GROUP BY department, job_title;

Điều này có thể cho chúng ta kết quả như sau:

department job_title employee_count
Sales Sales Rep 8
Sales Sales Manager 2
Marketing Content Writer 3
Marketing SEO Specialist 2
IT Developer 6
IT IT Manager 2

Bây giờ chúng ta có thể thấy không chỉ số lượng nhân viên trong mỗi phòng ban, mà còn cách họ phân phối qua các chức danh công việc khác nhau. Đó như thể tổ chức thư viện theo thể loại và sau đó theo tác giả!

MySQL GROUP BY với câu lệnh ORDER BY

Thường xuyên, chúng ta muốn kết quả nhóm của mình theo một thứ tự cụ thể. Đó là khi câu lệnh ORDER BY trở nên hữu ích. Hãy sắp xếp kết quả trước đó theo phòng ban và sau đó theo số lượng nhân viên giảm dần:

SELECT department, job_title, COUNT(*) AS employee_count
FROM employees
GROUP BY department, job_title
ORDER BY department, employee_count DESC;

Điều này sẽ cho chúng ta:

department job_title employee_count
IT Developer 6
IT IT Manager 2
Marketing Content Writer 3
Marketing SEO Specialist 2
Sales Sales Rep 8
Sales Sales Manager 2

Bây giờ kết quả của chúng ta được tổ chức gọn gàng theo phòng ban, và trong mỗi phòng ban, các chức danh công việc được sắp xếp theo số lượng nhân viên giảm dần.

MySQL GROUP BY với câu lệnh HAVING

Đôi khi, chúng ta muốn lọc kết quả nhóm của mình. Chúng ta có thể sử dụng câu lệnh WHERE, nhưng điều đó sẽ lọc các hàng trước khi chúng được nhóm. Vậy nếu chúng ta muốn lọc chính các nhóm thì sao? Đó là khi câu lệnh HAVING ra vào cuộc.

Giả sử chúng ta chỉ muốn thấy các phòng ban có hơn 5 nhân viên:

SELECT department, COUNT(*) AS employee_count
FROM employees
GROUP BY department
HAVING employee_count > 5;

Điều này có thể cho chúng ta:

department employee_count
Sales 10
IT 8

Câu lệnh HAVING đã lọc bỏ phòng ban Marketing vì nó chỉ có 5 nhân viên.

Câu lệnh GROUP BY sử dụng chương trình khách

Bây giờ, hãy áp dụng tất cả những gì chúng ta đã học bằng cách sử dụng một chương trình khách MySQL. Tôi sẽ sử dụng trình khách dòng lệnh MySQL cho ví dụ này, nhưng nguyên tắc tương tự đối với bất kỳ trình khách MySQL nào.

Đầu tiên, hãy tạo bảng employees và chèn một số dữ liệu:

CREATE TABLE employees (
employee_id INT PRIMARY KEY,
name VARCHAR(50),
department VARCHAR(50),
job_title VARCHAR(50),
salary DECIMAL(10, 2)
);

INSERT INTO employees VALUES
(1, 'John Doe', 'Sales', 'Sales Rep', 50000),
(2, 'Jane Smith', 'Marketing', 'Content Writer', 55000),
(3, 'Bob Johnson', 'IT', 'Developer', 65000),
(4, 'Alice Brown', 'Sales', 'Sales Manager', 70000),
(5, 'Charlie Davis', 'IT', 'IT Manager', 75000);

Bây giờ, hãy chạy một truy vấn kết hợp tất cả những gì chúng ta đã học:

SELECT department, job_title, AVG(salary) AS avg_salary, COUNT(*) AS employee_count
FROM employees
GROUP BY department, job_title
HAVING avg_salary > 60000
ORDER BY avg_salary DESC;

Truy vấn này:

  1. Nhóm nhân viên theo phòng ban và chức danh công việc
  2. Tính toán mức lương trung bình và số lượng nhân viên cho mỗi nhóm
  3. Chỉ hiển thị các nhóm có mức lương trung bình trên $60,000
  4. Sắp xếp kết quả theo mức lương trung bình giảm dần

Kết quả có thể trông như sau:

department job_title avg_salary employee_count
IT IT Manager 75000.00 1
Sales Sales Manager 70000.00 1
IT Developer 65000.00 1

Và thế là xong! Chúng ta đã cùng nhau hành trình từ cơ bản của GROUP BY đến việc kết hợp nó với các câu lệnh khác để phân tích dữ liệu mạnh mẽ. Hãy nhớ rằng, thực hành là cách tốt nhất để hoàn thiện kỹ năng. Hãy thử viết các truy vấn của riêng bạn, thử nghiệm với các kết hợp khác nhau, và sớm bạn sẽ nhóm dữ liệu như một quản trị viên cơ sở dữ liệu có kinh nghiệm!

Chúc các bạn thành công và dữ liệu của bạn luôn được tổ chức tốt!

Credits: Image by storyset