Trong SQL, chúng ta đã học cách sử dụng GROUP BY
để nhóm dữ liệu và áp dụng các hàm tổng hợp như COUNT
, SUM
, AVG
, v.v. Tuy nhiên, có lúc bạn sẽ cần lọc kết quả sau khi đã nhóm – chẳng hạn, chỉ lấy những nhóm có tổng lớn hơn một giá trị nào đó. Đây là lúc chúng ta cần đến câu lệnh HAVING
.
Câu lệnh WHERE
không thể dùng để lọc kết quả nhóm vì nó chạy trước GROUP BY
. Thay vào đó, HAVING
được dùng để lọc sau khi dữ liệu đã được nhóm.
Sự khác nhau giữa WHERE
và HAVING
Tiêu chí | WHERE | HAVING |
---|---|---|
Thời điểm lọc | Trước khi nhóm (GROUP BY ) | Sau khi nhóm (GROUP BY ) |
Dùng với | Cột thông thường | Hàm tổng hợp hoặc nhóm |
Ví dụ:
Giả sử ta có bảng orders
như sau:
id | customer_id | amount |
---|---|---|
1 | 1 | 100 |
2 | 1 | 200 |
3 | 2 | 150 |
4 | 2 | 300 |
5 | 3 | 80 |
Cú pháp của HAVING
SELECT column1, aggregate_function(column2)
FROM table
GROUP BY column1
HAVING condition;
Ví dụ thực tế với HAVING
Mục tiêu: Tìm những khách hàng có tổng số tiền đặt hàng lớn hơn 250.
SELECT customer_id, SUM(amount) AS total_amount
FROM orders
GROUP BY customer_id
HAVING SUM(amount) > 250;
Kết quả:
customer_id | total_amount |
---|---|
1 | 300 |
2 | 450 |
Khách hàng số 3 không được liệt kê vì tổng đơn hàng chỉ là 80.
Kết hợp WHERE
và HAVING
Bạn có thể dùng cả hai khi cần lọc trước và sau khi nhóm.
SELECT customer_id, SUM(amount) AS total_amount
FROM orders
WHERE amount >= 100
GROUP BY customer_id
HAVING SUM(amount) > 250;
Ở ví dụ trên:
WHERE amount >= 100
: chỉ xét các đơn hàng từ 100 trở lên.HAVING
: lọc tổng sau khi đã nhóm.
Một số lưu ý
HAVING
chỉ nên dùng khi bạn cần lọc sau khi nhóm (GROUP BY
). Nếu không nhóm thì dùngWHERE
.- Có thể sử dụng các hàm tổng hợp trong
HAVING
:COUNT()
,SUM()
,AVG()
,MAX()
,MIN()
. - Khi kết hợp với
JOIN
, hãy xác định rõ điều kiện lọc ở đâu để tránh nhầm lẫn.
Tổng kết
HAVING
là công cụ cực kỳ quan trọng khi làm việc với dữ liệu nhóm. Nó cho phép bạn kiểm soát kỹ hơn những gì hiển thị sau khi tính toán tổng, trung bình hoặc đếm. Nắm vững HAVING
sẽ giúp bạn thực hiện các truy vấn thống kê và báo cáo chính xác hơn.
Thảo luận