← Back to Questions
SQL

What is the difference between HAVING and WHERE clause?

Learn What is the difference between HAVING and WHERE clause? with simple explanations, real-time examples, interview tips and practical use cases.

WHERE and HAVING clauses are both used to filter data in SQL, but they work at different stages of query execution.

In simple words:

  • WHERE filters rows before grouping
  • HAVING filters groups after grouping

Main Difference Between HAVING and WHERE

Feature WHERE HAVING
Purpose Filters rows Filters groups
Execution Stage Before GROUP BY After GROUP BY
Works With Individual rows Aggregated groups
Aggregate Functions Usually not allowed Commonly used
Performance Generally faster Usually slower
Common Usage Row-level filtering Aggregate filtering

What is WHERE Clause?

WHERE clause filters:

  • Individual rows before grouping or aggregation

WHERE Internal Architecture

Read Table Rows
      |
      v
Apply WHERE Condition
      |
      v
Filter Matching Rows
      |
      v
Pass Rows to GROUP BY

WHERE Example

SELECT *

FROM employees

WHERE salary > 50000;

Result

Only employees with salary greater than:

  • 50000

Important Point

WHERE filters:

  • Rows before aggregation

What is HAVING Clause?

HAVING clause filters:

  • Groups after GROUP BY aggregation

HAVING Internal Architecture

Read Table Rows
      |
      v
GROUP BY Applied
      |
      v
Aggregate Functions Calculated
      |
      v
Apply HAVING Condition
      |
      v
Filter Matching Groups

HAVING Example

SELECT department,
       AVG(salary) AS avg_salary

FROM employees

GROUP BY department

HAVING AVG(salary) > 50000;

Result

Only departments where:

  • Average salary is greater than 50000

Important Point

HAVING filters:

  • Aggregated groups

Visual Difference Between WHERE and HAVING

WHERE

All Rows
   |
Filter Individual Rows
   |
Remaining Rows

HAVING

All Rows
   |
GROUP BY
   |
Aggregated Groups
   |
Filter Groups

Execution Order in SQL

FROM
  →
WHERE
  →
GROUP BY
  →
HAVING
  →
SELECT
  →
ORDER BY

Why This Matters

  • WHERE executes before grouping
  • HAVING executes after grouping

WHERE with GROUP BY Example

SELECT department,
       COUNT(*) AS total_employees

FROM employees

WHERE salary > 30000

GROUP BY department;

Meaning

  • First filters employees with salary > 30000
  • Then groups remaining rows

HAVING with GROUP BY Example

SELECT department,
       COUNT(*) AS total_employees

FROM employees

GROUP BY department

HAVING COUNT(*) > 5;

Meaning

  • First groups employees by department
  • Then filters departments having more than 5 employees

WHERE Cannot Usually Use Aggregate Functions

Invalid Example

SELECT department,
       AVG(salary)

FROM employees

WHERE AVG(salary) > 50000

GROUP BY department;

Problem

  • Aggregate functions not yet calculated during WHERE execution

Correct Version Using HAVING

SELECT department,
       AVG(salary)

FROM employees

GROUP BY department

HAVING AVG(salary) > 50000;

WHERE vs HAVING Performance

Feature WHERE HAVING
Filtering Time Early filtering Late filtering
Rows Processed Fewer rows More rows before filtering
Performance Usually faster Usually slower

Why WHERE is Faster

  • Reduces rows before grouping
  • Less aggregation work required

Best Practice

Use:

  • WHERE whenever possible before GROUP BY

Combined WHERE and HAVING Example

SELECT department,
       AVG(salary) AS avg_salary

FROM employees

WHERE salary > 30000

GROUP BY department

HAVING AVG(salary) > 50000;

Execution Steps

  1. WHERE filters salary > 30000
  2. GROUP BY groups departments
  3. AVG() calculated
  4. HAVING filters avg_salary > 50000

WHERE and HAVING Query Flow

Read Table Rows
      |
      v
Apply WHERE Filter
      |
      v
GROUP BY Processing
      |
      v
Calculate Aggregates
      |
      v
Apply HAVING Filter
      |
      v
Final Result

WHERE Clause Use Cases

  • Filtering records
  • Search conditions
  • Date filtering
  • Status filtering

Example

WHERE order_date >= '2025-01-01'

HAVING Clause Use Cases

  • Filtering grouped reports
  • Aggregate analysis
  • Business intelligence queries

Example

HAVING SUM(total_sales) > 100000

WHERE in Banking Systems

Banking systems use WHERE for:

  • Transaction filtering
  • Date range queries
  • Account status filtering

HAVING in Banking Systems

Banking systems use HAVING for:

  • High-value transaction analysis
  • Fraud detection summaries
  • Branch performance reports

WHERE in E-Commerce

E-commerce systems use WHERE for:

  • Product filtering
  • Order searches
  • Customer queries

HAVING in E-Commerce

E-commerce systems use HAVING for:

  • Top-selling products
  • Revenue analysis
  • Customer purchase summaries

WHERE in Learning Platforms

Learning systems use WHERE for:

  • Student filtering
  • Course searches
  • Assessment filtering

HAVING in Learning Platforms

Learning systems use HAVING for:

  • Performance analytics
  • Course completion reports
  • Top student analysis

WHERE in Microservices

Microservices architectures use WHERE for:

  • API filtering
  • Transactional queries
  • Service-specific searches

HAVING in Microservices

Microservices use HAVING for:

  • Analytics APIs
  • Aggregated dashboards
  • Reporting systems

Advantages of WHERE

  • Faster filtering
  • Reduces data early
  • Improves performance

Disadvantages of WHERE

  • Cannot directly filter aggregate results

Advantages of HAVING

  • Supports aggregate filtering
  • Useful for grouped analysis

Disadvantages of HAVING

  • Usually slower
  • Processes grouped data first

Best Practices

  • Use WHERE for row filtering
  • Use HAVING for aggregate filtering
  • Filter early using WHERE when possible
  • Avoid unnecessary HAVING conditions
  • Optimize GROUP BY queries properly

Common Interview Mistake

Many developers think:

  • WHERE and HAVING are interchangeable

Reality

WHERE:

  • Filters rows before grouping

while HAVING:

  • Filters groups after aggregation

Related Learning Topics


Professional Interview Answer

The WHERE clause in SQL is used to filter individual rows before grouping and aggregation occur, while the HAVING clause is used to filter grouped or aggregated results after GROUP BY execution. WHERE works on raw row data and is commonly used for row-level filtering conditions such as dates, status, or numeric values. HAVING works on aggregated data and is typically used with aggregate functions like COUNT(), SUM(), AVG(), MAX(), and MIN(). WHERE generally provides better performance because filtering happens earlier in query execution, reducing the amount of data processed during grouping. Enterprise systems such as banking platforms, e-commerce applications, ERP systems, analytics platforms, and microservices architectures use both WHERE and HAVING extensively for transactional filtering and business intelligence reporting.


Why Interviewers Like This Answer

  • Clearly explains execution order
  • Differentiates row filtering vs group filtering
  • Includes performance understanding
  • Explains aggregate function usage
  • Provides enterprise-level examples

Frequently Asked Questions

What is WHERE clause in SQL?

WHERE filters rows before grouping and aggregation.

What is HAVING clause in SQL?

HAVING filters grouped or aggregated data after GROUP BY.

Can aggregate functions be used in WHERE?

Usually no, aggregate functions are commonly used in HAVING.

Which is faster: WHERE or HAVING?

WHERE is usually faster because filtering occurs earlier.

Can WHERE and HAVING be used together?

Yes, WHERE filters rows first, and HAVING filters grouped results afterward.

Why this SQL question is important?

This interview question helps candidates understand real-time backend development concepts, practical problem solving, coding fundamentals, system design basics and production-ready application behavior.

Practice this question carefully for Java backend roles, Spring Boot developer interviews, microservices interviews, company interviews and full-stack developer preparation.

About the Author

Naresh Kumar is a Senior Java Backend Engineer with experience building enterprise applications using Java, Spring Boot, Microservices, Docker, Kubernetes and Cloud technologies.