ไม่สามารถใช้ SUM() ใน WHERE ได้ ต้องใช้ HAVING แทน
คำสั่ง WHERE ทำงาน **ก่อน** การจัดกลุ่ม (GROUP BY) และ Aggregate Functions ในขณะที่ HAVING ทำงาน **หลัง** GROUP BY จึงสามารถใช้ Aggregate Functions ได้
ลำดับการประมวลผลของ SQL
- FROM / JOIN
- WHERE (Filter แถวเดี่ยว)
- GROUP BY (จัดกลุ่ม)
- Aggregate Functions (SUM, COUNT, MAX, MIN, AVG)
- HAVING (Filter กลุ่ม)
- SELECT (เลือกคอลัมน์)
- ORDER BY
- LIMIT
ตัวอย่าง: หากลุ่มที่ Sum(Price) > 40
1. สร้างตารางและเพิ่มข้อมูล
CREATE TABLE DemoTable (Name VARCHAR(50), Price INT);
INSERT INTO DemoTable VALUES
('Chris', 30), ('David', 40), ('Chris', 10), ('Mike', 44), ('David', 5);
2. ดูข้อมูล
SELECT * FROM DemoTable;
ผลลัพธ์:
+-------+-------+
| Name | Price |
+-------+-------+
| Chris | 30 |
| David | 40 |
| Chris | 10 |
| Mike | 44 |
| David | 5 |
+-------+-------+
3. ผิด: ใช้ SUM() ใน WHERE (Error)
SELECT Name, SUM(Price) FROM DemoTable
WHERE SUM(Price) > 40
GROUP BY Name;
-- ERROR 1111 (HY000): Invalid use of group function
4. ถูกต้อง: ใช้ HAVING
SELECT Name, SUM(Price) AS Total_Price
FROM DemoTable
GROUP BY Name
HAVING Total_Price > 40;
ผลลัพธ์:
+-------+-------------+
| Name | Total_Price |
+-------+-------------+
| David | 45 |
| Mike | 44 |
+-------+-------------+
Chris: 30+10=40 (ไม่ > 40) → ไม่แสดง | David: 40+5=45, Mike: 44 → แสดง
สรุป: WHEN TO USE WHAT
| Clause | ใช้กับ | ตัวอย่าง |
|---|---|---|
| WHERE | คอลัมน์ตรง, ฟังก์ชัน Scalar | WHERE Price > 10, WHERE Name = 'John' |
| HAVING | Aggregate Functions, GROUP BY columns | HAVING SUM(Price) > 40, HAVING COUNT(*) > 1 |