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 ก่อน แล้วค่อยเปรียบเทียบ