Bird
Raised Fist0
SQLquery~5 mins

WHERE vs HAVING mental model in SQL - Quick Revision & Key Differences

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Recall & Review
beginner
What is the main purpose of the WHERE clause in SQL?
The WHERE clause filters rows before any grouping happens. It decides which rows to include in the query based on conditions.
Click to reveal answer
beginner
What does the HAVING clause do in SQL?
The HAVING clause filters groups after the data has been grouped by GROUP BY. It lets you filter aggregated results.
Click to reveal answer
intermediate
When should you use WHERE instead of HAVING?
Use WHERE to filter individual rows before grouping. Use HAVING to filter groups after aggregation.
Click to reveal answer
intermediate
Can HAVING be used without GROUP BY? Explain.
Yes, HAVING can be used without GROUP BY to filter aggregated results on the whole table, but this is less common.
Click to reveal answer
beginner
Example: Which clause filters rows before aggregation: WHERE or HAVING?
WHERE filters rows before aggregation, so it affects which data is grouped and aggregated.
Click to reveal answer
Which SQL clause filters rows before grouping?
AWHERE
BHAVING
CGROUP BY
DORDER BY
Which clause is used to filter groups after aggregation?
AHAVING
BSELECT
CWHERE
DFROM
Can WHERE filter aggregated results directly?
AYes, always
BOnly with HAVING
COnly with GROUP BY
DNo, WHERE filters before aggregation
Which clause would you use to filter customers with total sales over 1000?
AWHERE total_sales > 1000
BORDER BY total_sales > 1000
CHAVING total_sales > 1000
DGROUP BY total_sales > 1000
What happens if you put an aggregate function in WHERE clause?
AIt works fine
BSyntax error or unexpected result
CIt filters groups
DIt orders rows
Explain the difference between WHERE and HAVING clauses in SQL.
Think about when filtering happens: before or after grouping.
You got /4 concepts.
    Describe a real-life example where you would use HAVING instead of WHERE.
    Consider filtering on sums or counts, not individual rows.
    You got /4 concepts.

      Practice

      (1/5)
      1. Which clause should you use to filter rows before grouping in a SQL query?
      easy
      A. HAVING
      B. WHERE
      C. GROUP BY
      D. ORDER BY

      Solution

      1. Step 1: Understand filtering before grouping

        The WHERE clause filters individual rows before any grouping happens in the query.
      2. Step 2: Compare WHERE and HAVING roles

        HAVING filters groups after grouping, so it cannot filter rows before grouping.
      3. Final Answer:

        WHERE -> Option B
      4. Quick Check:

        Filter rows before grouping = WHERE [OK]
      Hint: Use WHERE for rows, HAVING for groups after grouping [OK]
      Common Mistakes:
      • Using HAVING to filter rows before grouping
      • Confusing GROUP BY as a filter
      • Using ORDER BY to filter data
      2. Which of the following SQL queries correctly filters groups having a total sales greater than 1000?
      easy
      A. SELECT store, SUM(sales) FROM sales_data WHERE SUM(sales) > 1000 GROUP BY store;
      B. SELECT store, SUM(sales) FROM sales_data WHERE sales > 1000 GROUP BY store;
      C. SELECT store, SUM(sales) FROM sales_data GROUP BY store HAVING SUM(sales) > 1000;
      D. SELECT store, SUM(sales) FROM sales_data HAVING SUM(sales) > 1000 GROUP BY store;

      Solution

      1. Step 1: Identify correct HAVING usage

        HAVING is used to filter groups based on aggregate functions like SUM.
      2. Step 2: Check query syntax and order

        SELECT store, SUM(sales) FROM sales_data GROUP BY store HAVING SUM(sales) > 1000; correctly uses GROUP BY first, then HAVING with SUM(sales) > 1000.
      3. Final Answer:

        SELECT store, SUM(sales) FROM sales_data GROUP BY store HAVING SUM(sales) > 1000; -> Option C
      4. Quick Check:

        Filter groups by aggregate = HAVING [OK]
      Hint: HAVING filters aggregates after GROUP BY [OK]
      Common Mistakes:
      • Using WHERE with aggregate functions
      • Placing HAVING before GROUP BY
      • Filtering rows instead of groups
      3. Given the table orders(order_id, customer_id, amount), what will this query return?
      SELECT customer_id, COUNT(*) AS order_count FROM orders WHERE amount > 50 GROUP BY customer_id HAVING order_count > 2;
      medium
      A. Customers with total amount over 50
      B. All customers with orders over 50 regardless of count
      C. Syntax error because alias can't be used in HAVING
      D. Customers with more than 2 orders where each order amount is over 50

      Solution

      1. Step 1: Understand alias usage in HAVING

        Many SQL databases allow using column aliases like order_count directly in HAVING clause, but standard SQL does not. However, most practical systems support it.
      2. Step 2: Identify correct HAVING syntax

        Using alias in HAVING is often allowed; thus, the query returns customers with more than 2 orders where each order amount is over 50.
      3. Final Answer:

        Customers with more than 2 orders where each order amount is over 50 -> Option D
      4. Quick Check:

        HAVING filters groups; alias usage depends on SQL dialect [OK]
      Hint: Use full aggregate in HAVING or alias depending on SQL dialect [OK]
      Common Mistakes:
      • Using alias in HAVING clause (may be allowed in some SQL dialects)
      • Confusing WHERE and HAVING filters
      • Assuming HAVING filters rows
      4. Identify the error in this SQL query:
      SELECT department, AVG(salary) FROM employees HAVING AVG(salary) > 50000 WHERE department LIKE 'Sales%' GROUP BY department;
      medium
      A. WHERE clause used after HAVING
      B. HAVING clause used before GROUP BY
      C. Missing alias for AVG(salary)
      D. GROUP BY clause missing

      Solution

      1. Step 1: Check SQL clause order

        The correct order is WHERE, then GROUP BY, then HAVING.
      2. Step 2: Identify misplaced WHERE clause

        In the query, WHERE appears after HAVING, which is invalid syntax.
      3. Final Answer:

        WHERE clause used after HAVING -> Option A
      4. Quick Check:

        WHERE before GROUP BY, HAVING after [OK]
      Hint: WHERE before GROUP BY, HAVING after GROUP BY [OK]
      Common Mistakes:
      • Placing WHERE after HAVING
      • Forgetting GROUP BY clause
      • Using HAVING without GROUP BY
      5. You want to find all customers who placed more than 3 orders with each order amount greater than 100. Which query correctly applies WHERE and HAVING?
      hard
      A. SELECT customer_id FROM orders WHERE amount > 100 GROUP BY customer_id HAVING COUNT(*) > 3;
      B. SELECT customer_id FROM orders GROUP BY customer_id HAVING COUNT(*) > 3 AND amount > 100;
      C. SELECT customer_id FROM orders HAVING COUNT(*) > 3 WHERE amount > 100 GROUP BY customer_id;
      D. SELECT customer_id FROM orders WHERE COUNT(*) > 3 GROUP BY customer_id HAVING amount > 100;

      Solution

      1. Step 1: Filter rows with WHERE

        Use WHERE to keep only orders with amount > 100 before grouping.
      2. Step 2: Filter groups with HAVING

        Use HAVING to keep customers with more than 3 such orders (COUNT(*) > 3).
      3. Final Answer:

        SELECT customer_id FROM orders WHERE amount > 100 GROUP BY customer_id HAVING COUNT(*) > 3; -> Option A
      4. Quick Check:

        WHERE filters rows, HAVING filters groups [OK]
      Hint: WHERE filters rows, HAVING filters groups after grouping [OK]
      Common Mistakes:
      • Using HAVING to filter rows
      • Placing WHERE after HAVING
      • Using aggregate in WHERE clause