Cách dùng HAVING trong MySQL: khác với WHERE, ví dụ truy vấn

1. HAVING clause là gì

HAVING clause là cú pháp trong SQL để đặt điều kiện cho kết quả tổng hợp sau khi dữ liệu được nhóm lại. Thông thường, nó được sử dụng kết hợp với câu lệnh GROUP BY, thực hiện vai trò lọc dữ liệu sau khi đã tổng hợp. Bằng cách sử dụng HAVING, có thể trích xuất chỉ những nhóm đáp ứng các tiêu chuẩn nhất định. Ví dụ, khi muốn trích xuất các khách hàng có tổng doanh thu vượt qua một mức nhất định hoặc các nhóm có điểm trung bình vượt qua một mức độ cụ thể, câu lệnh HAVING được sử dụng. Ngược lại với câu lệnh WHERE áp dụng điều kiện cho từng hàng trước khi tổng hợp, HAVING áp dụng điều kiện cho kết quả sau khi đã tổng hợp.

Ví dụ sử dụng HAVING

Ví dụ, truy vấn để trích xuất các khách hàng có tổng doanh thu vượt quá 10.000 yên như sau.
SELECT KhachHangID, SUM(DoanhThu) AS TongDoanhThu
FROM BangDoanhThu
GROUP BY KhachHangID
HAVING SUM(DoanhThu) > 10000;
Truy vấn này sử dụng hàm SUM để tính tổng doanh thu của mỗi khách hàng, và chỉ trích xuất những khách hàng mà kết quả vượt quá 10.000 yên.

2. Cú pháp cơ bản và cách sử dụng mệnh đề HAVING

Cú pháp cơ bản của mệnh đề HAVING như sau.
SELECT ten_cot, ham_tong_hop(ten_cot)
FROM ten_bang
GROUP BY ten_cot
HAVING bieu_thuc_die_kien;
Cú pháp này sẽ nhóm dữ liệu bằng mệnh đề GROUP BY, và lọc kết quả đã tổng hợp bằng cách chỉ định điều kiện trong mệnh đề HAVING. Ví dụ, truy vấn để trích xuất các khách hàng có số lượng đơn hàng từ bảng doanh thu là 5 hoặc hơn như sau.
SELECT khach_hang_id, COUNT(don_hang_id) AS so_luong_don_hang
FROM bang_don_hang
GROUP BY khach_hang_id
HAVING COUNT(don_hang_id) >= 5;
Ở đây, chúng ta sử dụng hàm COUNT để đếm số lượng đơn hàng của mỗi khách hàng, và chỉ lọc những khách hàng có số lượng đơn hàng từ 5 trở lên.

3. Ví dụ áp dụng HAVING

Câu lệnh HAVING là công cụ hữu ích kết hợp với các hàm tổng hợp để thực hiện phân tích dữ liệu nâng cao. Dưới đây là một số ví dụ cụ thể.

Ví dụ 1: Lọc theo tổng doanh thu

Để trích xuất các sản phẩm có doanh thu vượt quá 10.000 yên, sử dụng hàm SUM như sau.
SELECT Mã_sản_phẩm, SUM(doanh_thu) AS Tổng_doanh_thu
FROM bảng_sản_phẩm
GROUP BY Mã_sản_phẩm
HAVING SUM(doanh_thu) > 10000;
Truy vấn này tính tổng doanh thu cho mỗi sản phẩm và trích xuất những sản phẩm có tổng vượt quá 10.000 yên.

Ví dụ 2: Lọc theo số lượng đơn hàng

Nếu một khách hàng cụ thể có hơn 10 đơn hàng, trích xuất khách hàng đó.
SELECT Mã_khách_hàng, COUNT(Mã_đơn_hàng) AS Số_lượng_đơn_hàng
FROM bảng_đơn_hàng
GROUP BY Mã_khách_hàng
HAVING COUNT(Mã_đơn_hàng) > 10;
Truy vấn này tính số lượng đơn hàng cho mỗi khách hàng và chỉ trích xuất những khách hàng có ít nhất 10 đơn hàng.

4. Sự khác nhau với mệnh đề WHERE

Mệnh đề HAVING và WHERE đều thực hiện việc lọc dữ liệu, nhưng thời điểm áp dụng của chúng khác nhau.

Sự khác nhau về thời điểm áp dụng

  • mệnh đề WHERE: Được áp dụng trước khi nhóm dữ liệu, thực hiện lọc trên từng hàng riêng lẻ.
  • mệnh đề HAVING: Được áp dụng sau khi nhóm dữ liệu, thực hiện lọc trên kết quả tổng hợp.
Ví dụ, trong một truy vấn kết hợp WHERE và HAVING, đầu tiên dữ liệu có doanh thu trên 1000 yên được lọc bằng mệnh đề WHERE, sau đó kết quả có tổng doanh thu vượt quá 5.000 yên được trích xuất bằng mệnh đề HAVING.
SELECT CustomerID, SUM(Sales) AS TotalSales
FROM SalesTable
WHERE Sales >= 1000
GROUP BY CustomerID
HAVING SUM(Sales) > 5000;
Trong truy vấn này, dữ liệu đã được lọc bằng mệnh đề WHERE sẽ được áp dụng GROUP BYHAVING, và chỉ các khách hàng có doanh thu trên 5.000 yên sẽ được trích xuất.

5. Lưu ý khi sử dụng mệnh đề HAVING

Cần kết hợp với các hàm tổng hợp

Mệnh đề HAVING thực hiện việc lọc trên kết quả tổng hợp, do đó cần kết hợp với các hàm tổng hợp như SUM hoặc COUNT. Các điều kiện cho từng hàng riêng lẻ nên sử dụng mệnh đề WHERE.

Sử dụng alias

Trong mệnh đề HAVING, bạn có thể viết biểu thức điều kiện bằng cách sử dụng alias được chỉ định bằng AS. Ví dụ, có thể gán alias cho tổng doanh thu như sau.
SELECT KháchHàngID, SUM(DoanhThu) AS TổngDoanhThu
FROM BangDoanhThu
GROUP BY KháchHàngID
HAVING TổngDoanhThu > 10000;
Truy vấn này sẽ trích xuất các khách hàng có tổng doanh thu vượt quá 10,000 đồng.

6. Tóm tắt: Cách sử dụng mệnh đề HAVING

HAVING là một công cụ mạnh mẽ để gắn điều kiện vào dữ liệu tổng hợp và lọc dữ liệu một cách linh hoạt. Đặc biệt, khi phân tích dữ liệu tổng hợp như doanh thu và số lượng đơn hàng, việc sử dụng HAVING giúp thực hiện phân tích dữ liệu hiệu quả. Khi hiểu sự khác biệt với mệnh đề WHERE và kết hợp chúng một cách thích hợp, bạn có thể khai thác tối đa tính linh hoạt của truy vấn SQL.