Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

หาค่าเฉลี่ยและแสดงเฉพาะกลุ่มที่ Average สูงกว่า 80 (HAVING AVG)

กรองกลุ่มด้วย HAVING AVG() > Threshold

ใช้ GROUP BY จัดกลุ่ม AVG() คำนวณค่าเฉลี่ยต่อกลุ่ม แล้ว HAVING AVG(...) > 80 กรองเฉพาะกลุ่มที่ผ่านเกณฑ์

สร้างตารางและข้อมูล

mysql> CREATE TABLE DemoTable (
    -> PlayerId INT,
    -> PlayerScore INT
    -> );
Query OK, 0 rows affected (0.55 sec)

mysql> INSERT INTO DemoTable VALUES
    -> (1, 78), (2, 82), (1, 45), (3, 97), (2, 79);
Query OK, 5 rows affected

ข้อมูลทั้งหมด

+----------+-------------+
| PlayerId | PlayerScore |
+----------+-------------+
|        1 |          78 |
|        2 |          82 |
|        1 |          45 |
|        3 |          97 |
|        2 |          79 |
+----------+-------------+

คำสั่ง: หา PlayerId ที่ Average Score > 80

mysql> SELECT PlayerId FROM DemoTable
    -> GROUP BY PlayerId
    -> HAVING AVG(PlayerScore) > 80;

ผลลัพธ์

+----------+
| PlayerId |
+----------+
|        2 |
|        3 |
+----------+

การคำนวณยืนยัน

  • Player 1: (78 + 45) / 2 = 61.5 → ไม่ผ่าน (≤ 80)
  • Player 2: (82 + 79) / 2 = 80.5 → ผ่าน (> 80)
  • Player 3: (97) / 1 = 97 → ผ่าน (> 80)

ขยาย: แสดงค่าเฉลี่ยพร้อมกัน

SELECT PlayerId, AVG(PlayerScore) AS avg_score
FROM DemoTable
GROUP BY PlayerId
HAVING AVG(PlayerScore) > 80
ORDER BY avg_score DESC;

ผลลัพธ์

+----------+-----------+
| PlayerId | avg_score |
+----------+-----------+
|        3 |   97.0000 |
|        2 |   80.5000 |
+----------+-----------+

WHERE vs HAVING

⚠️ ไม่สามารถใช้ Alias ใน HAVING ได้ในบาง Version

-- อาจ Error ใน MySQL เก่า
HAVING avg_score > 80

-- ปลอดภัย: ใช้ Expression เต็ม
HAVING AVG(PlayerScore) > 80

MySQL 8.0: ใช้ Window Function (Alternative)

SELECT DISTINCT PlayerId, AVG(PlayerScore) OVER (PARTITION BY PlayerId) AS avg_score
FROM DemoTable
QUALIFY AVG(PlayerScore) OVER (PARTITION BY PlayerId) > 80;
-- QUALIFY ไม่รองรับใน MySQL ต้องใช้ Subquery/CTE
Clauseใช้กรองทำงานก่อน/หลัง GROUP BY
WHEREแถวเดี่ยว (Row-level)ก่อน GROUP BY
HAVINGกลุ่ม (Group-level / Aggregate)หลัง GROUP BY