WHERE กรองแถว ก่อน Group By (Row-level Filter)
HAVING กรองกลุ่ม หลัง Group By (Group-level Filter) ใช้กับ Aggregate Functions ได้
สร้างตารางทดสอบ
mysql> CREATE TABLE WhereDemo (Price INT); mysql> INSERT INTO WhereDemo VALUES (100), (200), (300), (400);
WHERE กับ Aggregate → ERROR
mysql> SELECT SUM(Price) FROM WhereDemo WHERE SUM(Price) > 200; ERROR 1111 (HY000): Invalid use of group function
HAVING กับ Aggregate → OK
mysql> SELECT SUM(Price) FROM WhereDemo HAVING SUM(Price) > 500;
+------------+ | SUM(Price) | +------------+ | 1000 | +------------+
ลำดับการประมวลผล (Logical Order)
FROM/JOINWHERE(Filter Rows)GROUP BYHAVING(Filter Groups)SELECTORDER BYLIMIT
ตัวอย่างรวม WHERE + HAVING
-- หา Category ที่มียอดขายรวม > 10000 และมีสินค้ามากกว่า 5 รายการ SELECT category_id, SUM(amount) AS total_sales, COUNT(*) AS item_count FROM sales WHERE sale_date >= '2024-01-01' -- WHERE: กรองแถวก่อน Group GROUP BY category_id HAVING total_sales > 10000 AND item_count > 5; -- HAVING: กรอง Group
กฎป้ายท้าย: WHERE ไม่ใช้ Aggregate Function ได้ | HAVING ใช้ Aggregate Function ได้ | WHERE เร็วกว่า (ลด Row ก่อน Group) → ใช้ WHERE ได้ก่อนเสมอ