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:
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ụ
Cùng tham gia cộng đồng hỏi đáp về chủ đề Góc chia sẻ