Mệnh đề SQL GROUP BY và HAVING kèm các ví dụ

Nhóm SQL theo mệnh đề 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 giá trị. Mệnh đề GROUP BY được sử dụng trong câu lệnh SELECT. Tùy chọn, nó được sử dụng cùng với các hàm tổng hợp để tạo báo cáo tóm tắt từ cơ sở dữ liệu.

Đó là những gì nó làm, tóm tắt dữ liệu từ cơ sở dữ liệu.

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

NHÓM SQL THEO Cú pháp

Bây giờ chúng ta đã biết mệnh đề SQL GROUP BY là gì, hãy xem cú pháp của một nhóm cơ bản theo truy vấn.

SELECT statements... GROUP BY column_name1[,column_name2,...] [HAVING condition];

tại ĐÂY

  • “Câu lệnh SELECT…” là truy vấn lệnh SQL SELECT tiêu chuẩn.
  • "NHÓM THEO tên_cột1” là mệnh đề thực hiện việc phân nhóm dựa trên cột_name1.
  • “[,column_name2,…]” là tùy chọn; đại diện cho các tên cột khác khi việc nhóm được thực hiện trên nhiều cột.
  • “[Điều kiện CÓ]” là tùy chọn; nó được sử dụng để hạn chế các hàng bị ảnh hưởng bởi mệnh đề GROUP BY. Nó tương tự như Mệnh đề WHERE.

Phân nhóm bằng cách sử dụng một Cột đơn

Để giúp hiểu tác dụng của mệnh đề SQL Group By, hãy thực hiện một truy vấn đơn giản trả về tất cả các mục nhập giới tính từ bảng thành viên.

SELECT `gender` FROM `members` ;
gender
Female
Female
Male
Female
Male
Male
Male
Male
Male

Giả sử chúng ta muốn có các giá trị duy nhất cho giới tính. Chúng ta có thể sử dụng truy vấn sau –

SELECT `gender` FROM `members` GROUP BY `gender`;

Thực thi đoạn script trên trong MySQL bàn làm việc so với Myflixdb cung cấp cho chúng ta kết quả sau.

gender
Female
Male

Lưu ý chỉ có hai kết quả được trả về. Điều này là do chúng tôi chỉ có hai loại giới tính Nam và Nữ. Mệnh đề GROUP BY trong SQL đã nhóm tất cả các thành viên “Nam” lại với nhau và chỉ trả về một hàng duy nhất cho nó. Điều tương tự cũng xảy ra với các thành viên “Nữ”.

Phân nhóm bằng cách sử dụng nhiều cột

Giả sử chúng ta muốn có danh sách Category_id phim và năm phát hành tương ứng của chúng.

Hãy quan sát đầu ra của truy vấn đơn giản này

SELECT `category_id`,`year_released` FROM `movies` ;
category_id year_released
1 2011
2 2008
NULL 2008
NULL 2010
8 2007
6 2007
6 2007
8 2005
NULL 2012
7 1920
8 NULL
8 1920

Kết quả trên có nhiều điểm trùng lặp.

Hãy thực hiện cùng một truy vấn bằng cách sử dụng nhóm theo trong SQL –

SELECT `category_id`,`year_released` FROM `movies` GROUP BY `category_id`,`year_released`;

Thực thi đoạn script trên trong MySQL workbench so với myflixdb cung cấp cho chúng ta kết quả như hình dưới đây.

category_id year_released
NULL 2008
NULL 2010
NULL 2012
1 2011
2 2008
6 2007
7 1920
8 1920
8 2005
8 2007

Mệnh đề GROUP BY hoạt động trên cả id danh mục và năm phát hành để xác định độc đáo hàng trong ví dụ trên của chúng tôi.

Nếu id danh mục giống nhau nhưng năm phát hành khác nhau thì một hàng được coi là một hàng duy nhất. Nếu id danh mục và năm phát hành giống nhau trên nhiều hàng thì đó được coi là trùng lặp và chỉ một hàng được hiển thị.

Phân nhóm và Chức năng tổng hợp

Giả sử chúng ta muốn tổng số nam và nữ trong cơ sở dữ liệu của mình. Chúng ta có thể sử dụng tập lệnh sau được hiển thị bên dưới để thực hiện điều đó.

SELECT `gender`,COUNT(`membership_number`)  FROM `members` GROUP BY `gender`;

Thực thi đoạn script trên trong MySQL workbench so với myflixdb cung cấp cho chúng ta kết quả sau.

gender COUNT('membership_number')
Female 3
Male 5

Các kết quả hiển thị bên dưới được nhóm theo từng giá trị giới tính duy nhất được đăng và số lượng hàng được nhóm được tính bằng hàm tổng hợp COUNT.

Hạn chế kết quả truy vấn bằng cách sử dụng ĐANG CÓ điều khoản

Không phải lúc nào chúng ta cũng muốn thực hiện việc nhóm tất cả dữ liệu trong một bảng nhất định. Sẽ có những 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ử chúng ta muốn biết tất cả các năm phát hành cho thể loại phim có id là 8. Chúng ta sẽ sử dụng tập lệnh sau để đạt được kết quả.

SELECT * FROM `movies` GROUP BY `category_id`,`year_released` HAVING `category_id` = 8;

Thực thi đoạn script trên trong MySQL workbench so với Myflixdb cung cấp cho chúng ta kết quả như hình dưới đây.

movie_id title director year_released category_id
9 Honey mooners John Schultz 2005 8
5 Daddy's Little Girls NULL 2007 8

Lưu ý chỉ những phim có danh mục id 8 mới bị ảnh hưởng bởi mệnh đề GROUP BY của chúng tôi.

Tổng kết

  • Mệnh đề GROUP BY SQL được sử dụng để nhóm các hàng có cùng giá trị.
  • Mệnh đề GROUP BY được sử dụng cùng với mệnh đề Câu lệnh CHỌN SQL.
  • Câu lệnh SELECT được sử dụng trong mệnh đề GROUP BY chỉ có thể được sử dụng chứa tên cột, hàm tổng hợp, hằng số và biểu thức.
  • Mệnh đề có SQL được sử dụng để hạn chế các kết quả được trả về bởi mệnh đề GROUP BY.
  • Mệnh đề MYSQL GROUP BY được sử dụng để thu thập dữ liệu từ nhiều bản ghi và trả về bản ghi được thiết lập bởi một hoặc nhiều cột.