The HAVING clause is used to filter groups created by GROUP BY based on a condition, similar to how WHERE filters rows before grouping.
Click to reveal answer
beginner
How does HAVING differ from WHERE in SQL queries?
WHERE filters individual rows before grouping, while HAVING filters groups after aggregation is done.
Click to reveal answer
intermediate
Write a simple SQL query using HAVING to find departments with more than 5 employees.
SELECT department, COUNT(*) AS employee_count FROM employees GROUP BY department HAVING COUNT(*) > 5;
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 over the entire table, but it is less common.
Click to reveal answer
advanced
Why might you get an error if you use a column in HAVING that is not in GROUP BY or an aggregate function?
Because HAVING filters groups, any column used must be part of the grouping or an aggregate; otherwise, SQL doesn't know how to evaluate it for each group.
Click to reveal answer
What does the HAVING clause filter in an SQL query?
AGroups created by GROUP BY
BIndividual rows before grouping
COnly NULL values
DColumns in SELECT clause
✗ Incorrect
HAVING filters groups after aggregation, unlike WHERE which filters rows before grouping.
Which clause is used to filter rows before grouping?
AHAVING
BGROUP BY
CORDER BY
DWHERE
✗ Incorrect
WHERE filters rows before grouping, HAVING filters groups after aggregation.
Which of these is a valid use of HAVING?
AHAVING name = 'John'
BHAVING salary > 50000
CHAVING COUNT(*) > 10
DHAVING age < 30
✗ Incorrect
HAVING works with aggregate functions like COUNT; conditions on individual columns require WHERE.
Can HAVING be used without GROUP BY?
AYes, to filter aggregated results over the whole table
BNo, it always requires GROUP BY
COnly in MySQL
DOnly with ORDER BY
✗ Incorrect
HAVING can filter aggregated results without GROUP BY, though it's less common.
What happens if you use a non-aggregated column in HAVING that is not in GROUP BY?
AQuery runs normally
BSQL error occurs
CColumn is ignored
DResults are duplicated
✗ Incorrect
SQL requires columns in HAVING to be aggregated or grouped; otherwise, it throws an error.
Explain the difference between WHERE and HAVING clauses in SQL with an example.
Think about when filtering happens in the query process.
You got /3 concepts.
Describe a scenario where HAVING is necessary and WHERE cannot be used.
Consider filtering groups by their total or average.
You got /3 concepts.
Practice
(1/5)
1. What is the main purpose of the HAVING clause in a PostgreSQL query?
easy
A. To join two tables
B. To filter rows before grouping
C. To sort the result set
D. To filter groups after aggregation
Solution
Step 1: Understand the role of HAVING
The HAVING clause is used to filter groups created by GROUP BY based on aggregate conditions.
Step 2: Differentiate HAVING from WHERE
WHERE filters rows before grouping, HAVING filters groups after aggregation.
Final Answer:
To filter groups after aggregation -> Option D
Quick Check:
HAVING filters groups = D [OK]
Hint: Remember HAVING filters groups, WHERE filters rows [OK]
Common Mistakes:
Confusing HAVING with WHERE clause
Thinking HAVING sorts data
Using HAVING without GROUP BY
2. Which of the following is the correct syntax to filter groups having a total sales greater than 1000 using HAVING?
easy
A. SELECT store, SUM(sales) FROM sales_data HAVING SUM(sales) > 1000 GROUP BY store;
B. SELECT store, SUM(sales) FROM sales_data GROUP BY store HAVING SUM(sales) > 1000;
C. SELECT store, SUM(sales) FROM sales_data WHERE SUM(sales) > 1000 GROUP BY store;
D. SELECT store, SUM(sales) FROM sales_data GROUP BY store WHERE SUM(sales) > 1000;
Solution
Step 1: Identify correct order of clauses
GROUP BY must come before HAVING in SQL syntax.
Step 2: Check aggregate usage in HAVING
HAVING uses aggregate functions like SUM(sales) to filter groups.
Final Answer:
SELECT store, SUM(sales) FROM sales_data GROUP BY store HAVING SUM(sales) > 1000; -> Option B
Quick Check:
GROUP BY before HAVING = B [OK]
Hint: HAVING always follows GROUP BY clause [OK]
Common Mistakes:
Placing HAVING before GROUP BY
Using WHERE with aggregate functions
Incorrect clause order
3. Given the table orders with columns customer_id and amount, what will this query return?
SELECT customer_id, COUNT(*) FROM orders GROUP BY customer_id HAVING COUNT(*) > 2;
medium
A. All customers with more than 2 orders
B. All customers with exactly 2 orders
C. All customers with less than 2 orders
D. Syntax error due to HAVING clause
Solution
Step 1: Understand the GROUP BY and COUNT(*)
The query groups rows by customer_id and counts orders per customer.
Step 2: Apply HAVING filter
HAVING COUNT(*) > 2 keeps only customers with more than 2 orders.
Final Answer:
All customers with more than 2 orders -> Option A
Quick Check:
HAVING COUNT(*) > 2 filters groups with >2 rows [OK]
Hint: HAVING filters groups by aggregate results [OK]
Common Mistakes:
Confusing > 2 with = 2
Thinking HAVING causes syntax error
Ignoring GROUP BY effect
4. Identify the error in this query:
SELECT department, AVG(salary) FROM employees HAVING AVG(salary) > 50000 GROUP BY department;
medium
A. HAVING clause used before GROUP BY
B. AVG() cannot be used in HAVING
C. Missing WHERE clause before HAVING
D. No error, query is correct
Solution
Step 1: Check clause order
SQL requires GROUP BY before HAVING clause.
Step 2: Identify error in query
HAVING appears before GROUP BY, which is invalid syntax.
Final Answer:
HAVING clause used before GROUP BY -> Option A
Quick Check:
GROUP BY must precede HAVING [OK]
Hint: GROUP BY comes before HAVING always [OK]
Common Mistakes:
Placing HAVING before GROUP BY
Assuming AVG() not allowed in HAVING
Confusing WHERE and HAVING
5. You have a sales table with columns region, salesperson, and amount. Write a query to find regions where the total sales exceed 10,000 but only include salespeople who individually sold more than 3,000. Which query correctly applies HAVING to achieve this?
hard
A. SELECT region, salesperson, SUM(amount) FROM sales GROUP BY region, salesperson HAVING SUM(amount) > 3000 AND SUM(amount) > 10000;
B. SELECT region, SUM(amount) FROM sales GROUP BY region HAVING SUM(amount) > 10000 AND salesperson IN (SELECT salesperson FROM sales GROUP BY salesperson HAVING SUM(amount) > 3000);
C. SELECT region, salesperson, SUM(amount) FROM sales GROUP BY region, salesperson HAVING SUM(amount) > 3000 AND region IN (SELECT region FROM sales GROUP BY region HAVING SUM(amount) > 10000);
D. SELECT region, salesperson, SUM(amount) FROM sales WHERE SUM(amount) > 3000 GROUP BY region, salesperson HAVING SUM(amount) > 10000;
Solution
Step 1: Understand filtering conditions
We want regions with total sales > 10,000 and salespeople with sales > 3,000.
Step 2: Analyze correct logic
Group by region and salesperson, filter salespeople with >3000 sales using HAVING SUM(amount) > 3000, and filter regions with total sales > 10000 using a subquery in HAVING: region IN (SELECT region FROM sales GROUP BY region HAVING SUM(amount) > 10000).
Step 3: Check HAVING usage
This correctly applies HAVING on both salesperson and region aggregates using subquery.
Final Answer:
SELECT region, salesperson, SUM(amount) FROM sales GROUP BY region, salesperson HAVING SUM(amount) > 3000 AND region IN (SELECT region FROM sales GROUP BY region HAVING SUM(amount) > 10000); -> Option C
Quick Check:
Use HAVING with subqueries for multi-level group filters [OK]
Hint: Use HAVING with subqueries for multi-level group filters [OK]
Common Mistakes:
Using WHERE with aggregate functions
Incorrect clause order
Combining unrelated HAVING conditions without subqueries
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.