Difference Between WHERE
and HAVING
in SQL
Both WHERE
and HAVING
clauses are used to filter data in SQL queries, but they serve different purposes and are applied at different stages of query execution. Here's a detailed comparison:
1. Purpose
-
WHERE
Clause:- Filters rows before any grouping is performed.
- Used to specify conditions on individual rows.
-
HAVING
Clause:- Filters grouped data after the
GROUP BY
clause has been applied. - Typically used with aggregate functions like
SUM()
,COUNT()
,AVG()
, etc.
- Filters grouped data after the
2. Application
-
WHERE
:- Cannot be used with aggregate functions (e.g.,
SUM
,COUNT
). - Example:
SELECT * FROM employees WHERE salary > 50000;
- This filters employees with a salary greater than 50,000.
- Cannot be used with aggregate functions (e.g.,
-
HAVING
:- Specifically used to filter groups created by
GROUP BY
. - Can use aggregate functions for conditions.
- Example:
SELECT department, AVG(salary) AS avg_salary FROM employees GROUP BY department HAVING AVG(salary) > 60000;
- This filters departments where the average salary exceeds 60,000.
- Specifically used to filter groups created by
3. Order of Execution
-
WHERE
:- Applied early in the query, before rows are grouped.
- Affects which rows are included in the grouping.
-
HAVING
:- Applied after
GROUP BY
has created groups. - Filters the aggregated result of the groups.
- Applied after
4. Key Differences
Aspect |
WHERE Clause |
HAVING Clause |
---|---|---|
Purpose | Filters rows before grouping. | Filters aggregated groups. |
Use with Aggregates | Cannot use aggregate functions. | Can use aggregate functions. |
Execution Order | Applied before GROUP BY . |
Applied after GROUP BY . |
Scope | Operates on individual rows. | Operates on grouped data. |
Examples
Using WHERE
:
SELECT employee_id, first_name, salary
FROM employees
WHERE salary > 50000;
- Filters individual rows where the
salary
is greater than 50,000.
Using HAVING
:
SELECT department_id, COUNT(*) AS employee_count
FROM employees
GROUP BY department_id
HAVING COUNT(*) > 10;
- Filters departments where the number of employees exceeds 10.
Combined Example:
SELECT department_id, AVG(salary) AS avg_salary
FROM employees
WHERE salary > 30000
GROUP BY department_id
HAVING AVG(salary) > 50000;
-
WHERE
: Filters rows wheresalary
is greater than 30,000. -
HAVING
: Filters groups where the average salary exceeds 50,000.
When to Use WHERE
vs HAVING
- Use
WHERE
for filtering rows based on simple conditions (non-aggregate). - Use
HAVING
for filtering groups after applyingGROUP BY
or aggregate functions.
Conclusion
The WHERE
clause focuses on filtering individual rows before any grouping, while the HAVING
clause deals with filtering aggregated data after grouping. Understanding these distinctions is crucial for writing efficient SQL queries that handle both row-level and group-level filtering.
Hi, I'm Abhay Singh Kathayat!
I am a full-stack developer with expertise in both front-end and back-end technologies. I work with a variety of programming languages and frameworks to build efficient, scalable, and user-friendly applications.
Feel free to reach out to me at my business email: kaashshorts28@gmail.com.
Top comments (0)