0
0
Lập trình
NM

Giải Thích SQL GROUP BY với Ví Dụ Cụ Thể

Đăng vào 6 tháng trước

• 4 phút đọc

Giới Thiệu

Khi làm việc với cơ sở dữ liệu, bạn thường muốn có những tóm tắt thay vì chỉ những hàng dữ liệu thô. SQL GROUP BY là một công cụ mạnh mẽ giúp bạn nhóm các hàng có giá trị giống nhau và áp dụng các hàm như COUNT(), SUM() hoặc AVG(). Bài viết này sẽ đi sâu vào cách sử dụng GROUP BY với nhiều ví dụ cụ thể và thực tiễn.

Mục Tiêu Học Tập

Trong hướng dẫn này, chúng ta sẽ tìm hiểu về các chức năng chính của GROUP BY:

  • COUNT() - Đếm số lượng hàng
  • SUM() - Tính tổng giá trị
  • AVG() - Tính giá trị trung bình
  • HAVING - Lọc kết quả đã nhóm
  • JOIN - Sử dụng tên thay vì ID
  • MIN() - Tìm giá trị nhỏ nhất
  • MAX() - Tìm giá trị lớn nhất

Ví Dụ Các Bảng

Chúng ta sẽ sử dụng một cơ sở dữ liệu cửa hàng đơn giản với các khách hàng và đơn hàng của họ.

GROUP BY với COUNT

Để đếm số lượng đơn hàng mà mỗi khách hàng đã thực hiện, bạn có thể sử dụng truy vấn sau:

sql Copy
SELECT customer_id, COUNT(*) AS order_count
FROM Orders
GROUP BY customer_id;

Kết quả:
Mỗi customer_id được nhóm lại và số lượng đơn hàng được đếm.

GROUP BY với SUM

Tiếp theo, chúng ta sẽ tìm tổng chi tiêu của mỗi khách hàng:

sql Copy
SELECT customer_id, SUM(total_amount) AS total_spent
FROM Orders
GROUP BY customer_id;

Kết quả:
Mỗi customer_id được nhóm lại và SUM(total_amount) cho biết tổng số tiền họ đã chi tiêu.

Bảng Khách Hàng

Để báo cáo của chúng ta dễ đọc hơn, hãy tạo một bảng Customers với tên của mỗi khách hàng:

customer_id name
1 Sarah James
2 Mark White
3 Olivia Reed

Bảng này có thể được kết nối với Orders thông qua customer_id. Từ giờ, chúng ta sẽ sử dụng JOIN để hiển thị tên thay vì ID.

GROUP BY với AVG

Chúng ta có thể tính giá trị đơn hàng trung bình cho mỗi khách hàng (hiển thị tên thông qua JOIN):

sql Copy
SELECT c.name, AVG(o.total_amount) AS avg_order
FROM Customers c
JOIN Orders o ON c.customer_id = o.customer_id
GROUP BY c.name;

Kết quả:
Sarah đã đặt hai đơn hàng với giá trị lần lượt là 50 và 70 → giá trị trung bình là 60.

GROUP BY với HAVING

Đôi khi, bạn muốn lọc sau khi đã nhóm. Đây là lúc HAVING xuất hiện (không phải WHERE).

sql Copy
SELECT c.name, SUM(o.total_amount) AS total_spent
FROM Customers c
JOIN Orders o ON c.customer_id = o.customer_id
GROUP BY c.name
HAVING SUM(o.total_amount) > 50;

Kết quả:
Chỉ những khách hàng có tổng chi tiêu trên 50 mới được bao gồm.

GROUP BY với JOIN

JOIN giúp bạn hiển thị nhãn thay vì ID trong các kết quả đã nhóm.

sql Copy
SELECT c.name, SUM(o.total_amount) AS total_spent
FROM Customers c
JOIN Orders o ON c.customer_id = o.customer_id
GROUP BY c.name;

Kết quả:
Sử dụng JOIN bất cứ khi nào bạn muốn tên dễ đọc trong báo cáo của mình.

GROUP BY với MIN

Tìm giá trị đơn hàng nhỏ nhất cho mỗi khách hàng (tên thông qua JOIN):

sql Copy
SELECT c.name, MIN(o.total_amount) AS min_order
FROM Customers c
JOIN Orders o ON c.customer_id = o.customer_id
GROUP BY c.name;

Kết quả:
Điều này trả về giá trị thấp nhất của đơn hàng cho mỗi khách hàng.

GROUP BY với MAX

Tìm giá trị đơn hàng lớn nhất cho mỗi khách hàng (tên thông qua JOIN):

sql Copy
SELECT c.name, MAX(o.total_amount) AS max_order
FROM Customers c
JOIN Orders o ON c.customer_id = o.customer_id
GROUP BY c.name;

Kết quả:
Điều này trả về giá trị cao nhất của đơn hàng cho mỗi khách hàng.

Cách Thực Hiện Điều Này Một Cách Trực Quan Trong DbSchema

Với DbSchema, bạn không cần phải gõ SQL từ đầu - bạn có thể xây dựng các truy vấn GROUP BY một cách trực quan trong Query Builder:

  1. Kéo bảng của bạn (CustomersOrders) vào canvas.
  2. Kết nối chúng qua khóa ngoại.
  3. Chọn các cột bạn muốn hiển thị (ví dụ: name).
  4. Nhấp chuột phải vào một cột số (như total_amount).
  5. Chọn Aggregate → SUM, COUNT, AVG, MIN, MAX.

DbSchema tự động thêm GROUP BY cho bạn và hiển thị SQL được tạo bên cạnh sơ đồ. Điều này giúp bạn học SQL dễ dàng hơn vì bạn có thể thấy cả cấu trúc trực quan và mã truy vấn cùng một lúc.

Tóm Tắt

  • GROUP BY nhóm các hàng có giá trị giống nhau.
  • Kết hợp với COUNT, SUM, AVG, MIN, MAX để tóm tắt dữ liệu.
  • Sử dụng HAVING để lọc nhóm sau khi đã tổng hợp.
  • Rất phù hợp cho các báo cáo về tổng số, trung bình và theo danh mục.

Hỏi Đáp

Q1: GROUP BY có thể sử dụng với các bảng nào?
A: Bất kỳ bảng nào trong cơ sở dữ liệu đều có thể sử dụng GROUP BY để nhóm dữ liệu.

Q2: Tôi có thể kết hợp nhiều cột trong GROUP BY không?
A: Có, bạn có thể nhóm theo nhiều cột bằng cách liệt kê chúng trong câu lệnh GROUP BY.

Q3: Có cách nào để tối ưu hóa hiệu suất của các truy vấn GROUP BY không?
A: Sử dụng chỉ mục trên các cột được nhóm có thể cải thiện hiệu suất của truy vấn.

Tài Nguyên Tham Khảo

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào