Finding duplicates efficiently in SQL - Time & Space Complexity
When we look for duplicates in a database table, we want to know how the work grows as the table gets bigger.
We ask: How much longer does it take to find duplicates if we add more rows?
Analyze the time complexity of the following code snippet.
SELECT column_name, COUNT(*)
FROM table_name
GROUP BY column_name
HAVING COUNT(*) > 1;
This query finds all values in column_name that appear more than once in table_name.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Scanning all rows to group by the column.
- How many times: Each row is processed once to count duplicates.
As the number of rows grows, the database must check each row once to group and count.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 10 row checks |
| 100 | About 100 row checks |
| 1000 | About 1000 row checks |
Pattern observation: The work grows directly with the number of rows.
Time Complexity: O(n)
This means the time to find duplicates grows in a straight line as the table gets bigger.
[X] Wrong: "Finding duplicates takes much longer than just reading the table once."
[OK] Correct: The database groups rows in one pass, so it doesn't repeatedly scan the table.
Understanding how grouping works helps you explain efficient data checks clearly and confidently.
"What if we added an index on column_name? How would the time complexity change?"
Practice
GROUP BY with HAVING COUNT(*) > 1 in SQL?Solution
Step 1: Understand GROUP BY usage
GROUP BY groups rows that have the same value in specified columns.Step 2: Use HAVING COUNT(*) > 1 to filter groups
HAVING COUNT(*) > 1 keeps only groups with more than one row, meaning duplicates.Final Answer:
To find duplicate values in a column -> Option BQuick Check:
GROUP BY + HAVING COUNT(*) > 1 = Find duplicates [OK]
- Confusing HAVING with WHERE clause
- Using COUNT(column) instead of COUNT(*)
- Not grouping by the correct column
email values in a table named users?Solution
Step 1: Check correct syntax for grouping and filtering
GROUP BY groups rows; HAVING filters groups. WHERE cannot filter aggregates.Step 2: Identify correct query
SELECT email FROM users GROUP BY email HAVING COUNT(*) > 1; uses GROUP BY email and HAVING COUNT(*) > 1 correctly.Final Answer:
SELECT email FROM users GROUP BY email HAVING COUNT(*) > 1; -> Option AQuick Check:
GROUP BY + HAVING filters duplicates correctly [OK]
- Using WHERE with aggregate functions
- Placing WHERE after GROUP BY
- Using COUNT(column) incorrectly in WHERE
orders with column customer_id, what will this query return?SELECT customer_id FROM orders GROUP BY customer_id HAVING COUNT(*) > 2;
Solution
Step 1: Understand HAVING COUNT(*) > 2 condition
This filters groups where the count of rows is greater than 2.Step 2: Apply to customer_id groups
Only customer IDs with more than 2 orders appear in the result.Final Answer:
All customer IDs with more than 2 orders -> Option DQuick Check:
HAVING COUNT(*) > 2 means count > 2 [OK]
- Thinking it finds exactly 2 instead of more than 2
- Confusing WHERE and HAVING clauses
- Ignoring GROUP BY effect
username values:SELECT username FROM users WHERE COUNT(username) > 1 GROUP BY username;
Solution
Step 1: Check WHERE clause usage
WHERE cannot filter on aggregate functions like COUNT().Step 2: Correct clause to use HAVING
HAVING is used to filter groups after GROUP BY with aggregates.Final Answer:
COUNT() cannot be used in WHERE clause -> Option CQuick Check:
Aggregates need HAVING, not WHERE [OK]
- Using WHERE with aggregate functions
- Placing GROUP BY after WHERE
- Confusing COUNT() usage
product_code values in a large inventory table but also want to see how many times each duplicate appears. Which query is the most efficient and correct?Solution
Step 1: Check correct use of GROUP BY and HAVING
SELECT product_code, COUNT(*) AS count FROM inventory GROUP BY product_code HAVING count > 1; groups by product_code and filters groups with count > 1 using HAVING, which is correct.Step 2: Verify alias usage and efficiency
Using COUNT(*) AS count allows filtering with HAVING count > 1 efficiently and shows counts.Final Answer:
SELECT product_code, COUNT(*) AS count FROM inventory GROUP BY product_code HAVING count > 1; -> Option AQuick Check:
GROUP BY + HAVING with alias count shows duplicates and counts [OK]
- Using WHERE with COUNT()
- Placing WHERE after GROUP BY
- Not selecting count to see duplicate frequency
Ready to prove it?
Pass the test and this pattern moves unknown
