Tóm tắt
HAVING lọc **sau khi GROUP BY**, thường dùng với hàm aggregate (MAX, MIN, COUNT, SUM...). Khác với WHERE lọc trước khi nhóm.
Cú pháp
SELECT cot_nhom
FROM bang
GROUP BY cot_nhom
HAVING MAX(cot_nhom) < gia_tri;
Ví dụ
1. Tạo bảng
CREATE TABLE WhereAfterGroupDemo (
UserId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
UserProcess INT,
UserThreadId INT
);
2. Dữ liệu
INSERT INTO WhereAfterGroupDemo (UserProcess, UserThreadId) VALUES
(1211, 3), (1412, 3), (1510, 4), (1511, 4);
3. Truy vấn: Lấy UserThreadId có MAX(UserProcess) < 1510
SELECT UserThreadId
FROM WhereAfterGroupDemo
GROUP BY UserThreadId
HAVING MAX(UserProcess) < 1510;
4. Kết quả
+--------------+
| UserThreadId |
+--------------+
| 3 |
Giải thích: Thread 3 có Process max = 1412 < 1510. Thread 4 có max = 1511 ≥ 1510 → bị loại.
WHERE vs HAVING
| Đặc điểm | WHERE | HAVING |
|---|---|---|
| Lọc khi nào | Trước GROUP BY | Sau GROUP BY |
| Dùng aggregate | Không | Có |
| Dùng alias cột | Không (trong một số DB) | Có |
Mẹo
- Đặt điều kiện không aggregate vào WHERE để giảm hàng trước khi nhóm – nhanh hơn.
- Chỉ dùng HAVING cho điều kiện có aggregate.