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 |