Lọc nhóm bằng having

Đã hoàn thành

Khi bạn đã tạo nhóm bằng mệnh đề GROUP BY, bạn có thể lọc thêm kết quả. Mệnh đề HAVING đóng vai trò như một bộ lọc trên các nhóm. Điều này tương tự như cách mệnh đề WHERE hoạt động như một bộ lọc trên các hàng được mệnh đề FROM trả về.

Mệnh đề HAVING cho phép bạn tạo một điều kiện tìm kiếm, về khái niệm tương tự như vị từ của mệnh đề WHERE, điều này sau đó kiểm tra từng nhóm được mệnh đề GROUP BY trả về.

Ví dụ sau đây đếm các đơn hàng cho từng khách hàng và lọc kết quả để chỉ bao gồm những khách hàng đã đặt hơn 10 đơn hàng:

SELECT CustomerID,
      COUNT(*) AS OrderCount
FROM Sales.SalesOrderHeader
GROUP BY CustomerID
HAVING COUNT(*) > 10;

So sánh HAVING với WHERE

Mặc dù cả mệnh đề HAVING và WHERE đều lọc dữ liệu, hãy nhớ rằng WHERE hoạt động trên các hàng được mệnh đề FROM trả về. Nếu một GROUP BY ... Mục HAVING tồn tại trong truy vấn của bạn theo mệnh đề WHERE, mệnh đề WHERE sẽ lọc các hàng trước khi xử lý GROUP BY—có khả năng giới hạn các nhóm có thể được tạo.

Mệnh đề HAVING được xử lý sau GROUP BY và chỉ hoạt động trên các nhóm, không phải hàng chi tiết. Để tóm tắt:

  • Mệnh đề WHERE lọc các hàng trước khi tạo bất kỳ nhóm nào
  • Mệnh đề HAVING lọc toàn bộ các nhóm và thường xem kết quả của phép tổng hợp.