เมื่อต้องการกรองกลุ่มข้อมูลตามค่าเฉลี่ย (Aggregate) ต้องใช้ HAVING ไม่ใช่ WHERE เพราะ WHERE ทำงานก่อน GROUP BY ในขณะที่ HAVING ทำงานหลัง GROUP BY
ตัวอย่างการใช้งาน
สร้างตารางคะแนน (มีชื่อซ้ำ):
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);
ข้อมูลทั้งหมด:
+-------+-------+ | Name | Score | +-------+-------+ | Chris | 8 | | Bob | 4 | | Bob | 9 | | Chris | 6 | | David | 5 | | David | 7 | +-------+-------+
คำสั่งหาค่าเฉลี่ยต่อคน กรองค่าเฉลี่ย < 9.5 เรียงจากน้อยไปมาก
mysql> select Name, avg(Score) from DemoTable1338
-> group by Name
-> having avg(Score) < 9.5
-> order by avg(Score);
ผลลัพธ์
+-------+------------+ | Name | avg(Score) | +-------+------------+ | David | 6.0000 | | Bob | 6.5000 | | Chris | 7.0000 | +-------+------------+
คำอธิบาย:
GROUP BY Nameจัดกลุ่มตามชื่อAVG(Score)คำนวณค่าเฉลี่ยแต่ละกลุ่มHAVING AVG(Score) < 9.5กรองกลุ่มที่ค่าเฉลี่ยน้อยกว่า 9.5ORDER BY AVG(Score)เรียงตามค่าเฉลี่ย- ไม่สามารถใช้
WHERE AVG(Score) < 9.5ได้ (Error: Invalid use of group function)