Hướng dẫn having trong mysql

Tìm hiểu mệnh đề HAVING trong MySQL

- Trong hệ quản trị cơ sở dữ liệu MySQL, mệnh đề HAVING thường được sử dụng thay thế cho mệnh đề WHERE khi điều kiện chọn lọc dữ liệu có nhắc đến các hàm tính toán tổng hợp như: COUNT, SUM, MIN, MAX, AVG, . . . .

- Để sử dụng mệnh đề HAVING thì chúng ta dùng cú pháp như sau:

SELECT column_name(s)
FROM table_name
GROUP BY column_name
HAVING condition;

MỘT SỐ VÍ DỤ

- Trong bài học này, tôi sẽ sử dụng cái bảng Customers như bên dưới để làm một số ví dụ minh họa.

CustomerID CustomerName City
1 Nguyễn Thành Nhân Cần Thơ
2 Phạm Minh Cương An Giang
3 Hà Thị Cẩm Vân Sóc Trăng
4 Trần Thị Tuyết Nga Hậu Giang
5 Vũ Tùng Lâm Cần Thơ
6 Phạm Thị Hải Ngân Ninh Thuận
7 Nguyễn Ngọc Ánh Nhi Vĩnh Long
8 Trương Nữ Ngọc Diễm Bạc Liêu
9 Phạm Thị Diệu Hương Cần Thơ
10 Trần Phương Anh Vĩnh Long
11 Nguyễn Thị Hải Yến Tiền Giang
12 Mai Thị Lan Phương Sóc Trăng
13 Hoàng Nghĩa Tuyền Trà Vinh
14 Đặng Phước Trung Sóc Trăng
15 Nguyễn Huyền Hương Vị Thanh
16 Lê Văn Thơm Sóc Trăng

- Liệt kê những thành phố có nhiều hơn hoặc bằng 2 khách hàng.

SELECT City, COUNT(CustomerID) AS NumberOfCustomers
FROM Customers
GROUP BY City
HAVING COUNT(CustomerID) >= 2;

- Sau khi thực thi câu lệnh phía trên thì tôi sẽ lấy được một bảng dữ liệu như bên dưới:

City NumberOfCustomers
Cần Thơ 3
Sóc Trăng 4
Vĩnh Long 2

- Liệt kê những thành phố có nhiều hơn hoặc bằng 2 khách hàng.

(sắp xếp các thành phố theo thứ tự giảm dần của số lượng khách hàng)

SELECT City, COUNT(CustomerID) AS NumberOfCustomers
FROM Customers
GROUP BY City
HAVING COUNT(CustomerID) >= 2
ORDER BY NumberOfCustomers DESC;

- Sau khi thực thi câu lệnh phía trên thì tôi sẽ lấy được một bảng dữ liệu như bên dưới:

City NumberOfCustomers
Sóc Trăng 4
Cần Thơ 3
Vĩnh Long 2



Mệnh đề HAVING trong SQL cho phép bạn chỉ định điều kiện lọc mà kết quả nhóm xuất hiện trong kết quả.

Mệnh đề WHERE đặt các điều kiện vào các cột đã chọn, trong khi mệnh đề HAVING đặt các điều kiện vào các nhóm được tạo bởi mệnh đề GROUP BY.

Cú pháp

Các Mã lệnh sau đây cho thấy vị trí của khoản HAVING trong một truy vấn.

FROM
WHERE
GROUP BY
HAVING
ORDER BY

Mệnh đề HAVING phải tuân theo mệnh đề GROUP BY trong truy vấn và cũng phải trước mệnh đề ORDER BY nếu sử dụng. Mã lệnh sau đây có cú pháp của câu lệnh SELECT bao gồm mệnh đề HAVING:

SELECT column1, column2
FROM table1, table2
WHERE [ conditions ]
GROUP BY column1, column2
HAVING [ conditions ]
ORDER BY column1, column2



Ví dụ

Giả sử bảng CUSTOMERS có các bản ghi sau.

+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  1 | Ha Anh   |  32 | Da Nang   |  2000.00 |
|  2 | Van Ha   |  25 | Ha Noi    |  1500.00 |
|  3 | Vu Bang  |  23 | Vinh      |  2000.00 |
|  4 | Thu Minh |  25 | Ha Noi    |  6500.00 |
|  5 | Hai An   |  27 | Ha Noi    |  8500.00 |
|  6 | Hoang    |  22 | Ha Noi    |  4500.00 |
|  7 | Binh     |  24 | Ha Noi    | 10000.00 |
+----+----------+-----+-----------+----------+

Sau đây là một ví dụ, sẽ hiển thị một bản ghi cho một độ tuổi tương tự sẽ lớn hơn hoặc bằng 2.

SELECT ID, NAME, AGE, ADDRESS, SALARY
FROM CUSTOMERS
GROUP BY age
HAVING COUNT(age) >= 2;

Điều này sẽ tạo ra kết quả sau:

+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  2 | Van Ha   |  25 | Ha Noi    |  1500.00 |
+----+----------+-----+-----------+----------+



Nội dung chính

  • 1 Mệnh đề GROUP BY là gì?
  • 2 Cú pháp GROUP BY
  • 3 Ví dụ về GROUP BY
    • 3.1 Phân nhóm dựa trên một cột
    • 3.2 Phân nhóm dựa trên nhiều cột
    • 3.3 Phân nhóm với các hàm tổng hợp
  • 4 Giới hạn kết quả truy vấn bằng mệnh đề HAVING
  • 5 Kết luận

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:

Hướng dẫn having trong mysql

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:

Hướng dẫn having trong mysql
Hướng dẫn having trong mysql

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 :

Hướng dẫn having trong mysql

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

Hướng dẫn having trong mysql

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:

Hướng dẫn having trong mysql
Hướng dẫn having trong mysql

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:

Hướng dẫn having trong mysql
Hướng dẫn having trong mysql

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:

Hướng dẫn having trong mysql

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

Hướng dẫn having trong mysql

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:

Hướng dẫn having trong mysql

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

Hướng dẫn having trong mysql

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ụ

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