G-LEARNING
G-LEARNING
Thảo luận 0 thảo luận
Vỗ tay 0 vỗ tay
Lượt xem 3261 lượt xem

Tìm hiểu về mệnh đề GROUP BY và HAVING trong MySQL

Apr 13 2020

Mệnh đề GROUP BY là gì?

Mệnh đề GROUP BY là một lệnh SQL được sử dụng để nhóm các hàng có cùng một giá trị. Nó thường được sử dụng trong câu lệnh SELECT. 

GROUP BY là mệnh đề tùy chọn và thường được sử dụng cùng với các hàm tổng hợp với mục đích tạo các báo cáo tóm tắt từ cơ sở dữ liệu. Hay nói cách khác, GROUP BY hỗ trợ tóm tắt dữ liệu từ cơ sở dữ liệu.

Các câu truy vấn có chứa mệnh đề GROUP BY được gọi là các truy vấn nhóm và chỉ trả về một hàng cho mỗi mục được nhóm

Cú pháp GROUP BY

Hãy cùng xem xét cú pháp của GROUP BY:

Trong đó:

  • “SELECT statements…” là câu lệnh SELECT SQL tiêu chuẩn
  • “GROUP BY column_name1” là mệnh đề thực hiện nhiệm vụ phân nhóm dựa trên tên cột column_name1
  • “[,column_name2,…]” (tùy chọn) : đại diện cho tên cột khác khi việc phân nhóm được thực hiện dựa trên nhiều cột
  • “[HAVING condition]” (tùy chọn): được sử dụng để giới hạn các hàng bị ảnh hưởng bởi mệnh đề GROUP BY. Tương tự như mệnh đề WHERE.

Ví dụ về GROUP BY

Phân nhóm dựa trên một cột

Để hiểu được ảnh hưởng của mệnh đề GROUP BY, trước tiên chúng ta thực hiện một truy vấn đơn giản là trả về tất cả các mục nhập giới tính từ bảng members:

Giả sử rằng chúng ta muốn hiển thị một giá trị duy nhất cho mỗi loại giới tính, sử dụng câu truy vấn sau :

Sau khi thực hiện câu truy vấn trên, kết quả sẽ trả về như sau:

Lưu ý là chỉ có hai kết quả được trả lại bởi vì chúng ta chỉ có hai loại giới tính là Male và Female. Mệnh đề GROUP BY đã nhóm tất cả các thành viên “Male” lại với nhau và trả về một hàng duy nhất. Điều này cũng được thực hiện tương tự với tất cả thành viên là “Female”.

Phân nhóm dựa trên nhiều cột

Giả sử rằng chúng ta muốn lấy danh sách ID của tất cả các thể loại phim và năm phát hành tương ứng của chúng từ bảng movies. Thực hiện câu truy vấn sau:

Kết quả trên cho một số thông tin trùng lặp.

Khi thực hiện câu truy vấn trên cùng với GROUP BY:

GROUP BY hoạt động trên cả category_id và year_released để xác định hàng duy nhất trong ví dụ trên. 

Nếu category_id giống nhau nhưng year_released khác nhau, thì mỗi hàng được coi là một hàng chứa thông tin duy nhất. Nếu category_id và year_released giống nhau cho nhiều hơn một hàng thì nó được xem là trùng lặp và chỉ hiển thị một hàng trong kết quả. 

Phân nhóm với các hàm tổng hợp

Giả sử chúng ta muốn biết tổng số nam và nữ trong cơ sở dữ liệu thì có thể thực hiện câu lệnh sau đây:

Chạy câu lệnh trên cho ra kết quả:

Kết quả trên được nhóm theo từ giá trị giới tính duy nhất và số lượng hàng trong nhóm được tính bằng hàm tổng hợp COUNT

Giới hạn kết quả truy vấn bằng mệnh đề HAVING

Không phải trong trường hợp nào chúng ta cũng muốn nhóm tất cả các dữ liệu trong cùng một bảng. Sẽ có lúc chúng ta muốn giới hạn kết quả của mình theo một tiêu chí nhất định. Trong những trường hợp như vậy, chúng ta có thể sử dụng mệnh đề HAVING.

Giả sử rằng chúng ta muốn biết tất cả các năm phát hành cho một thể loại phim có ID là 8. Thực hiện câu lệnh sau:

Kết quả được hiển thị:

Lưu ý rằng ở đây chỉ những phim có category_id là 8 mới bị ảnh hưởng bởi mệnh đề GROUP BY.

Kết luận

  • Mệnh đề GROUP BY được sử dụng để nhóm các hàng có cùng một giá trị
  • Mệnh đề GROUP BY được sử dụng với câu lệnh truy vấn SELECT.
  • Câu lệnh SELECT có chứa mệnh đề GROUP BY chỉ có thể chứa tên cột, hàm tổng hợp, hằng số và biểu thức
  • Mệnh đề HAVING dùng để giới hạn các kết quả được trả về bởi mệnh lệnh GROUP BY

Các bạn có thể tham khảo thêm các bài viết khác về cách sử dụng MySQL:

Hướng dẫn sử dụng câu lệnh SELECT trong MySQL qua các ví dụ

Hướng dẫn câu lệnh DELETE trong MySQL và ví dụ minh họa

Hướng dẫn câu lệnh UPDATE trong MySQL và các ví dụ



Đánh giá bài viết này

Cùng tham gia cộng đồng hỏi đáp về chủ đề Góc chia sẻ

Thảo luận 0 câu trả lời
Lượt xem 3261 lượt xem
Vỗ tay vỗ tay

0 Bình luận

@ 2020 - Bản quyền của Công ty cổ phần công nghệ giáo dục Gitiho Việt Nam
Giấy chứng nhận Đăng ký doanh nghiệp số: 0109077145, cấp bởi Sở kế hoạch và đầu tư TP. Hà Nội