MySQL-এ WHERE ক্লজে সরাসরি অগ্রেগেট ফাংশন (যেমন AVG(), SUM()) ব্যবহার করলে ERROR 1111 (HY000): Invalid use of group function এরর আসে। সমাধান: সাবকোয়েরি ব্যবহার করুন।
ভুল পদ্ধতি (এরর দেবে)
SELECT * FROM EmployeeInformation WHERE EmployeeSalary > AVG(EmployeeSalary);
ERROR 1111 (HY000): Invalid use of group function
সঠিক পদ্ধতি: সাবকোয়েরি ব্যবহার
SELECT * FROM yourTableName
WHERE yourColumnName > (SELECT AVG(yourColumnName) FROM yourTableName);
উদাহরণ দিয়ে বুঝি
টেবিল তৈরি করুন:
mysql> CREATE TABLE EmployeeInformation (
-> EmployeeId INT,
-> EmployeeName VARCHAR(20),
-> EmployeeSalary INT,
-> EmployeeDateOfBirth DATETIME
-> );
Query OK, 0 rows affected (1.08 sec)
রেকর্ড ইনসার্ট করুন:
mysql> INSERT INTO EmployeeInformation VALUES(101, 'John', 5510, '1995-01-21');
mysql> INSERT INTO EmployeeInformation VALUES(102, 'Carol', 5600, '1992-03-25');
mysql> INSERT INTO EmployeeInformation VALUES(103, 'Mike', 5680, '1991-12-25');
mysql> INSERT INTO EmployeeInformation VALUES(104, 'David', 6000, '1991-12-25');
mysql> INSERT INTO EmployeeInformation VALUES(105, 'Bob', 7500, '1993-11-26');
সকল রেকর্ড:
mysql> SELECT * FROM EmployeeInformation;
+------------+--------------+----------------+---------------------+
| EmployeeId | EmployeeName | EmployeeSalary | EmployeeDateOfBirth |
+------------+--------------+----------------+---------------------+
| 101 | John | 5510 | 1995-01-21 00:00:00 |
| 102 | Carol | 5600 | 1992-03-25 00:00:00 |
| 103 | Mike | 5680 | 1991-12-25 00:00:00 |
| 104 | David | 6000 | 1991-12-25 00:00:00 |
| 105 | Bob | 7500 | 1993-11-26 00:00:00 |
+------------+--------------+----------------+---------------------+
5 rows in set (0.00 sec)
গড় বেতন (AVG) এর চেয়ে বেশি বেতন পাওয়া কর্মী বের করুন
mysql> SELECT * FROM EmployeeInformation
-> WHERE EmployeeSalary > (SELECT AVG(EmployeeSalary) FROM EmployeeInformation);
+------------+--------------+----------------+---------------------+
| EmployeeId | EmployeeName | EmployeeSalary | EmployeeDateOfBirth |
+------------+--------------+----------------+---------------------+
| 105 | Bob | 7500 | 1993-11-26 00:00:00 |
+------------+--------------+----------------+---------------------+
1 row in set (0.04 sec)
ব্যাখ্যা: সাবকোয়েরি (SELECT AVG(EmployeeSalary) FROM EmployeeInformation) প্রথমে একক মান (গড় বেতন) রিটার্ন করে, তারপর আউটার কোয়েরি সেটির সাথে তুলনা করে।
HAVING ক্লজ (GROUP BY থাকলে)
যদি GROUP BY থাকে, তবে অগ্রেগেট ফাংশন HAVING ক্লজে ব্যবহার করুন:
SELECT Department, AVG(Salary)
FROM Employees
GROUP BY Department
HAVING AVG(Salary) > 50000;