WHERE is used in any SELECT query, while HAVING clause is only used in SELECT queries, which contains aggregate
function or group by clause, which is correct. Though both WHERE and HAVING clause is used to specify filtering condition in SQL, there is
subtle difference between them.
The key difference between WHERE and HAVING clause in SQL is that, condition specified in WHERE clause is used while fetching data (rows) from table, and
data which doesn't pass the condition will not be fetched into result set, on
the other hand HAVING clause is later used to filter summarized data or grouped data. In
short if both WHERE and HAVING clause is used in a SELECT query with aggregate function or GROUP BY clause, it will execute before HAVING clause
The below example gives clear picture of
the use of where and having
SELECT * FROM Employee;
EMP_ID
|
EMP_NAME
|
EMP_AGE
|
EMP_SALARY
|
DEPT_ID
|
1
|
Virat
|
23
|
10000
|
1
|
2
|
Rohit
|
24
|
7000
|
2
|
3
|
Suresh
|
25
|
8000
|
3
|
4
|
Shikhar
|
27
|
6000
|
1
|
5
|
Vijay
|
28
|
5000
|
2
|
SELECT * FROM Department;
DEPT_ID
|
DEPT_NAME
|
1
|
Accounting
|
2
|
Marketing
|
3
|
Sales
|
SELECT d.DEPT_NAME, count(e.EMP_NAME) as NUM_EMPLOYEE, avg(e.EMP_SALARY) as AVG_SALARY FROM Employee e,
Department d WHERE e.DEPT_ID=d.DEPT_ID AND EMP_SALARY > 5000 GROUP BY d.DEPT_NAME;
DEPT_NAME
|
NUM_EMPLOYEE
|
AVG_SALARY
|
Accounting
|
1
|
8000
|
Marketing
|
1
|
7000
|
Sales
|
2
|
8000
|
SELECT d.DEPT_NAME, count(e.EMP_NAME) as NUM_EMPLOYEE, avg(e.EMP_SALARY) as AVG_SALARY FROM Employee e, Department d WHERE e.DEPT_ID=d.DEPT_ID AND EMP_SALARY > 5000 GROUP BY d.DEPT_NAME HAVING AVG_SALARY > 7000;
DEPT_NAME
|
NUM_EMPLOYEE
|
AVG_SALARY
|
Accounting
|
1
|
8000
|
Sales
|
2
|
8000
|
Difference between WHERE and HAVING in SQL
1).We can use WHERE clause with UPDATE and DELETE clause but HAVING clause can only be used with SELECT query.
eg:
update DEPARTMENT set DEPT_NAME="NewSales" WHERE DEPT_ID=1 ; // works
fine
Update DEPARTMENT set DEPT_NAME="NewSales" HAVING DEPT_ID=1; // error
Incorrect syntax near the keyword ’HAVING’. update DEPARTMENT set DEPT_NAME='NewSales' HAVING DEPT_ID=1
2)
WHERE clause is used for filtering rows
and it applies on each and every row, while HAVING clause
is used to filter groups in SQL.
3) One syntax level difference
between WHERE and HAVING clause is that, former is used before GROUP BY clause, while later is used after GROUP BY clause.
4)
When WHERE and HAVING clause are used together in a SELECT query with aggregate
function, WHERE clause is applied first on individual rows and only rows which
pass the condition is included for creating groups. Once group is created, HAVING clause is used to filter groups based upon condition
specified.