Feature |
WHERE |
HAVING |
Purpose |
Filters rows before grouping or aggregation occurs. |
Filters groups or aggregated data after grouping or aggregation
occurs. |
Execution Stage |
Operates during the row filtering stage, which is applied before the
GROUP BY clause in the query execution sequence. |
Operates during the group filtering stage, which is applied after
the GROUP BY clause and aggregation functions are processed. |
Filter Scope |
Works on individual rows of the table. |
Works on aggregated or grouped data (e.g., results of SUM, AVG,
COUNT, etc.). |
Use with Aggregate Functions |
Cannot use aggregate functions directly (e.g., SUM, AVG) unless
within a subquery or derived table. |
Specifically designed to work with aggregate functions or grouped
data. |
Application |
Used to filter raw data before grouping or aggregation. |
Used to filter data based on aggregate results after grouping. |
Performance Impact |
Typically faster since it filters rows earlier in the query
execution process, reducing the amount of data processed in later
stages. |
May be slower as it processes groups after aggregation, which could
involve more data to filter depending on the query complexity. |
Example with Aggregation |
sql<br>SELECT Department, SUM(Salary) AS TotalSalary<br>FROM
Employees<br>WHERE Department = 'Sales'<br>GROUP BY Department;<br> |
sql<br>SELECT Department, SUM(Salary) AS TotalSalary<br>FROM
Employees<br>GROUP BY Department<br>HAVING SUM(Salary) > 50000;<br> |
Combined Use |
Can be used together with HAVING in queries to filter rows before
and after aggregation. |
Complementary to WHERE, typically applied after the initial
filtering of rows. |
Example of Combined Use |
sql<br>SELECT Department, SUM(Salary) AS TotalSalary<br>FROM
Employees<br>WHERE JobTitle = 'Manager'<br>GROUP BY Department<br>HAVING
SUM(Salary) > 50000;<br> |
Filters rows where JobTitle is 'Manager' using WHERE, then filters
groups where the total salary exceeds 50,000 using HAVING. |
Error Example |
Using aggregate functions like SUM(Salary) in WHERE will result in a
syntax error unless wrapped in a subquery or processed elsewhere. |
Cannot directly filter raw data without grouping or aggregation
(e.g., HAVING Department = 'Sales' without a GROUP BY will cause an
error). |
Use Case |
- Filtering individual rows before grouping or aggregation. -
Example: Filtering employees in a specific department. |
- Filtering results of grouped or aggregated data after processing.
- Example: Finding departments where total salary exceeds a threshold. |