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

สามารถใช้ผลลัพธ์ของ SUM() ใน WHERE clause ของ MySQL ได้หรือไม่

ไม่สามารถใช้ SUM() ใน WHERE ได้ ต้องใช้ HAVING แทน

คำสั่ง WHERE ทำงาน **ก่อน** การจัดกลุ่ม (GROUP BY) และ Aggregate Functions ในขณะที่ HAVING ทำงาน **หลัง** GROUP BY จึงสามารถใช้ Aggregate Functions ได้

ลำดับการประมวลผลของ SQL

  1. FROM / JOIN
  2. WHERE (Filter แถวเดี่ยว)
  3. GROUP BY (จัดกลุ่ม)
  4. Aggregate Functions (SUM, COUNT, MAX, MIN, AVG)
  5. HAVING (Filter กลุ่ม)
  6. SELECT (เลือกคอลัมน์)
  7. ORDER BY
  8. 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

MySQL Extension: ใช้ Alias ใน HAVING ได้

SELECT Name, SUM(Price) AS Total_Price 
FROM DemoTable 
GROUP BY Name 
HAVING Total_Price > 40;  -- ใช้ Alias ได้ (MySQL Extension)

Standard SQL ต้องเขียน HAVING SUM(Price) > 40

กรณีซับซ้อน: WHERE + HAVING พร้อมกัน

SELECT Name, SUM(Price) AS Total_Price 
FROM DemoTable 
WHERE Price > 5          -- กรองแถวเดี่ยว: Price > 5
GROUP BY Name 
HAVING Total_Price > 40; -- กรองกลุ่ม: Sum > 40
Clauseใช้กับตัวอย่าง
WHEREคอลัมน์ตรง, ฟังก์ชัน ScalarWHERE Price > 10, WHERE Name = 'John'
HAVINGAggregate Functions, GROUP BY columnsHAVING SUM(Price) > 40, HAVING COUNT(*) > 1