where clause can not accept aggregate function like sum, count, etc. whereas having clause can accept the aggregate functions like sum, count, average, etc.
Let’s see it by example.
emp_salary_paid |
paid_id |
emp_id |
salary_given |
salary_month |
1 |
1 |
1000 |
jan |
2 |
2 |
1500 |
jan |
3 |
3 |
2000 |
jan |
4 |
1 |
1200 |
feb |
5 |
2 |
1500 |
feb |
6 |
3 |
1800 |
feb |
emp_detail |
emp_id |
emp_name |
1 |
Sajid |
2 |
John |
3 |
Ahmad |
Query:
SELECT emp_detail.emp_name, emp_salary_paid.salary_month, emp_salary_paid.salary_given
FROM emp_detail, emp_salary_paid
WHERE emp_detail.emp_id=emp_salary_paid.emp_id
will produce result like this one. because no aggregate function is being used here.
emp_name |
salary_month |
salary_given |
Sajid |
jan |
1000 |
Sajid |
feb |
1200 |
John |
jan |
1500 |
John |
feb |
1500 |
Ahmad |
jan |
2000 |
Ahmad |
feb |
1800 |
SELECT emp_detail.emp_name, SUM(emp_salary_paid.salary_given) AS total_paid
FROM emp_detail, emp_salary_paid
GROUP BY emp_detail.emp_id
WHERE SUM(emp_salary_paid.salary_given) >2000
This will produce an error, because aggregate function is being used with where clause. To overcome this, we use having clause like this one.
SELECT emp_detail.emp_name, SUM(emp_salary_paid.salary_given)
FROM emp_detail, emp_salary_paid
GROUP BY emp_detail.emp_id
HAVING SUM(emp_salary_paid.salary_given) > 2000
This will produce the correct result as follows:
emp_name |
total_paid |
Sajid |
9000 |
John |
9000 |
Ahmad |
9000 |