กรองกลุ่มด้วย 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
| Clause | ใช้กรอง | ทำงานก่อน/หลัง GROUP BY |
|---|---|---|
WHERE | แถวเดี่ยว (Row-level) | ก่อน GROUP BY |
HAVING | กลุ่ม (Group-level / Aggregate) | หลัง GROUP BY |