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

WHERE vs HAVING ใน MySQL: ความแตกต่างและเมื่อไหร่ควรใช้

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)

  1. FROM / JOIN
  2. WHERE (Filter Rows)
  3. GROUP BY
  4. HAVING (Filter Groups)
  5. SELECT
  6. ORDER BY
  7. LIMIT

ตัวอย่างรวม 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 ได้ก่อนเสมอ