Để lọc các nhóm (theo ID) có **giá trị trung bình** lớn hơn một ngưỡng, dùng GROUP BY + AVG() + HAVING.
Cú pháp
SELECT cot_nhom FROM ten_bang GROUP BY cot_nhom HAVING AVG(cot_so) > nguong;
Ví dụ minh họa
Tạo bảng điểm người chơi:
mysql> CREATE TABLE DemoTable (PlayerId INT, PlayerScore INT);
mysql> INSERT INTO DemoTable VALUES
-> (1,78), (2,82), (1,45), (3,97), (2,79);
Dữ liệu:
- PlayerId 1: 78, 45 → AVG = 61.5
- PlayerId 2: 82, 79 → AVG = 80.5
- PlayerId 3: 97 → AVG = 97
Truy vấn: ID có điểm trung bình > 80:
mysql> SELECT PlayerId FROM DemoTable
-> GROUP BY PlayerId
-> HAVING AVG(PlayerScore) > 80;
Kết quả:
+----------+ | PlayerId | +----------+ | 2 | | 3 | +----------+
Giải thích
GROUP BY PlayerId: gom hàng theo ID.AVG(PlayerScore): tính trung bình mỗi nhóm.HAVING AVG(PlayerScore) > 80: lọc nhóm **sau khi gom** (khác WHERE lọc trước khi gom).
Mở rộng
- Hiển thị cả giá trị trung bình:
SELECT PlayerId, AVG(PlayerScore) AS AvgScore ... HAVING AvgScore > 80. - Kết hợp
WHERElọc hàng trước khi gom:WHERE PlayerScore > 0 GROUP BY ... HAVING AVG(...) > 80. - Index trên
(PlayerId, PlayerScore)hỗ trợ loose index scan (MySQL 5.7+) cho GROUP BY.
⚠️ Lưu ý
HAVINGkhông dùng alias trong một số phiên bản cũ – dùng lại biểu thức:HAVING AVG(PlayerScore) > 80.- NULL trong cột số bị bỏ qua bởi AVG (không tính vào mẫu số).