| 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. |