Khi lọc sau khi gom nhóm (GROUP BY), dùng HAVING thay vì WHERE.
Ví dụ minh họa
Tạo bảng (có trùng tên với điểm khác nhau):
mysql> CREATE TABLE DemoTable1338 (Name VARCHAR(10), Score INT);
mysql> INSERT INTO DemoTable1338 VALUES('Chris', 8), ('Bob', 4), ('Bob', 9), ('Chris', 6), ('David', 5), ('David', 7);
Xem dữ liệu:
mysql> SELECT * FROM DemoTable1338;
+-------+-------+ | Name | Score | +-------+-------+ | Chris | 8 | | Bob | 4 | | Bob | 9 | | Chris | 6 | | David | 5 | | David | 7 | +-------+-------+
Tìm trung bình điểm theo tên, chỉ giữ nhóm có trung bình < 9.5, sắp xếp tăng dần:
mysql> SELECT Name, AVG(Score) FROM DemoTable1338
GROUP BY Name
HAVING AVG(Score) < 9.5
ORDER BY AVG(Score);
Kết quả:
+-------+------------+ | Name | avg(Score) | +-------+------------+ | David | 6.0000 | | Bob | 6.5000 | | Chris | 7.0000 | +-------+------------+
Quy tắc:
WHERE: lọc hàng trước GROUP BY.HAVING: lọc nhóm sau GROUP BY (có thể dùng hàm tập hợp: AVG, SUM, COUNT...).- Alias cột trong SELECT không dùng được trong HAVING ở một số phiên bản MySQL cũ - hãy lặp lại biểu thức
AVG(Score).