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

แก้ ERROR 1111: Invalid use of group function - ใช้ Aggregate กับ WHERE ให้ถูกต้อง

Error 1111 เกิดจากการใช้ Aggregate Function (COUNT, SUM, AVG, MAX, MIN) ใน WHERE clause โดยตรง ซึ่ง MySQL ไม่อนุญาต ต้องใช้ Subquery แทน

วิธีที่ผิด (Error 1111)

SELECT * FROM EmployeeInformation WHERE EmployeeSalary > AVG(EmployeeSalary);  -- ERROR!

วิธีที่ถูกต้อง: ใช้ Subquery

SELECT * FROM yourTableName WHERE yourColumn > (SELECT AVG(yourColumn) FROM yourTableName);

ตัวอย่างการใช้งาน

สร้างตาราง:

mysql> create table EmployeeInformation (
    -> EmployeeId int, EmployeeName varchar(20), EmployeeSalary int, EmployeeDateOfBirth datetime
    -> );

เพิ่มข้อมูล:

mysql> INSERT INTO EmployeeInformation VALUES 
(101,'John',5510,'1995-01-21'),(102,'Carol',5600,'1992-03-25'),
(103,'Mike',5680,'1991-12-25'),(104,'David',6000,'1991-12-25'),
(105,'Bob',7500,'1993-11-26');

ข้อมูล:

+------------+--------------+----------------+---------------------+
| EmployeeId | EmployeeName | EmployeeSalary | EmployeeDateOfBirth |
+------------+--------------+----------------+---------------------+
|        101 | John         |           5510 | 1995-01-21          |
|        102 | Carol        |           5600 | 1992-03-25          |
|        103 | Mike         |           5680 | 1991-12-25          |
|        104 | David        |           6000 | 1991-12-25          |
|        105 | Bob          |           7500 | 1993-11-26          |
+------------+--------------+----------------+---------------------+

หาพนักงานที่เงินเดือนมากกว่าค่าเฉลี่ย:

mysql> SELECT * FROM EmployeeInformation 
    -> WHERE EmployeeSalary > (SELECT AVG(EmployeeSalary) FROM EmployeeInformation);

ผลลัพธ์ (เฉพาะ Bob ที่ 7500 > ค่าเฉลี่ย ~6058):

+------------+--------------+----------------+---------------------+
| EmployeeId | EmployeeName | EmployeeSalary | EmployeeDateOfBirth |
+------------+--------------+----------------+---------------------+
|        105 | Bob          |           7500 | 1993-11-26          |
+------------+--------------+----------------+---------------------+

กฎทั่วไป

  • WHERE - กรองแถวเดี่ยว (Row-level) - ไม่ใช้ Aggregate ได้
  • HAVING - กรองกลุ่ม (Group-level) - ใช้ Aggregate ได้
  • Subquery ใน WHERE - คำนวณ Aggregate ก่อน แล้วค่อยเปรียบเทียบ