Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Tìm ID có điểm trung bình lớn hơn ngưỡng trong MySQL (AVG + HAVING)

Để 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 WHERE lọ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 ý

  • HAVING khô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ố).