Bird
Raised Fist0
SQLquery~20 mins

Finding duplicates efficiently in SQL - Practice Problems & Coding Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
Duplicate Finder Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ query_result
intermediate
2:00remaining
Find duplicate emails in a users table

Given a table users with columns id and email, which query returns all emails that appear more than once?

ASELECT email FROM users GROUP BY email HAVING COUNT(*) > 1;
BSELECT email FROM users WHERE COUNT(email) > 1;
CSELECT email FROM users GROUP BY email WHERE COUNT(*) > 1;
DSELECT email FROM users HAVING COUNT(email) > 1 GROUP BY email;
Attempts:
2 left
💡 Hint

Use GROUP BY to group emails and HAVING to filter groups by count.

❓ query_result
intermediate
2:00remaining
Retrieve duplicate product names with their counts

Which query returns product names that appear more than once in the products table along with how many times they appear?

ASELECT name, COUNT(*) FROM products GROUP BY name HAVING COUNT(*) > 1;
BSELECT name, COUNT(*) FROM products GROUP BY name WHERE COUNT(*) > 1;
CSELECT name, COUNT(*) FROM products WHERE COUNT(name) > 1 GROUP BY name;
DSELECT name FROM products GROUP BY name HAVING COUNT(*) > 1;
Attempts:
2 left
💡 Hint

Use GROUP BY and HAVING to filter duplicates and COUNT(*) to get counts.

📝 Syntax
advanced
2:00remaining
Identify the correct query to find duplicate usernames

Which query is syntactically correct and returns usernames that appear more than once in the accounts table?

ASELECT username FROM accounts HAVING COUNT(username) > 1 GROUP BY username;
BSELECT username FROM accounts WHERE COUNT(username) > 1 GROUP BY username;
CSELECT username FROM accounts GROUP BY username WHERE COUNT(*) > 1;
DSELECT username FROM accounts GROUP BY username HAVING COUNT(*) > 1;
Attempts:
2 left
💡 Hint

Remember that HAVING filters groups after GROUP BY, while WHERE filters rows before grouping.

❓ optimization
advanced
2:00remaining
Optimize duplicate detection on large tables

You want to find duplicate email values in a very large subscribers table efficiently. Which approach is best?

AScan the entire table without indexes using <code>GROUP BY email HAVING COUNT(*) > 1</code>.
BUse <code>SELECT DISTINCT email FROM subscribers</code> and then count duplicates in application code.
CCreate an index on the <code>email</code> column and use <code>GROUP BY email HAVING COUNT(*) > 1</code>.
DUse a subquery with <code>WHERE email IN (SELECT email FROM subscribers GROUP BY email HAVING COUNT(*) > 1)</code> without indexes.
Attempts:
2 left
💡 Hint

Indexes speed up grouping and counting on large datasets.

🧠 Conceptual
expert
2:00remaining
Understanding duplicate detection with NULL values

Consider a table contacts with a nullable phone column. Which statement about finding duplicates in phone is true?

AGROUP BY phone causes an error if NULL values exist.
BGROUP BY phone treats all NULLs as one group, so duplicates of NULL are counted.
CGROUP BY phone ignores NULLs, so duplicates of NULL are never detected.
DGROUP BY phone treats each NULL as distinct, so duplicates of NULL are not counted.
Attempts:
2 left
💡 Hint

Think about how SQL treats NULLs in grouping.

Practice

(1/5)
1. What is the main purpose of using GROUP BY with HAVING COUNT(*) > 1 in SQL?
easy
A. To sort the table alphabetically
B. To find duplicate values in a column
C. To delete rows from a table
D. To create a new table

Solution

  1. Step 1: Understand GROUP BY usage

    GROUP BY groups rows that have the same value in specified columns.
  2. Step 2: Use HAVING COUNT(*) > 1 to filter groups

    HAVING COUNT(*) > 1 keeps only groups with more than one row, meaning duplicates.
  3. Final Answer:

    To find duplicate values in a column -> Option B
  4. Quick Check:

    GROUP BY + HAVING COUNT(*) > 1 = Find duplicates [OK]
Hint: Use GROUP BY with HAVING COUNT(*) > 1 to spot duplicates fast [OK]
Common Mistakes:
  • Confusing HAVING with WHERE clause
  • Using COUNT(column) instead of COUNT(*)
  • Not grouping by the correct column
2. Which of the following SQL queries correctly finds duplicate email values in a table named users?
easy
A. SELECT email FROM users GROUP BY email HAVING COUNT(*) > 1;
B. SELECT email FROM users WHERE COUNT(email) > 1;
C. SELECT email FROM users GROUP BY email WHERE COUNT(*) > 1;
D. SELECT email FROM users HAVING COUNT(email) > 1;

Solution

  1. Step 1: Check correct syntax for grouping and filtering

    GROUP BY groups rows; HAVING filters groups. WHERE cannot filter aggregates.
  2. Step 2: Identify correct query

    SELECT email FROM users GROUP BY email HAVING COUNT(*) > 1; uses GROUP BY email and HAVING COUNT(*) > 1 correctly.
  3. Final Answer:

    SELECT email FROM users GROUP BY email HAVING COUNT(*) > 1; -> Option A
  4. Quick Check:

    GROUP BY + HAVING filters duplicates correctly [OK]
Hint: Use HAVING, not WHERE, to filter grouped results [OK]
Common Mistakes:
  • Using WHERE with aggregate functions
  • Placing WHERE after GROUP BY
  • Using COUNT(column) incorrectly in WHERE
3. Given the table orders with column customer_id, what will this query return?
SELECT customer_id FROM orders GROUP BY customer_id HAVING COUNT(*) > 2;
medium
A. All customer IDs with exactly 2 orders
B. All customer IDs regardless of order count
C. All customer IDs with less than 2 orders
D. All customer IDs with more than 2 orders

Solution

  1. Step 1: Understand HAVING COUNT(*) > 2 condition

    This filters groups where the count of rows is greater than 2.
  2. Step 2: Apply to customer_id groups

    Only customer IDs with more than 2 orders appear in the result.
  3. Final Answer:

    All customer IDs with more than 2 orders -> Option D
  4. Quick Check:

    HAVING COUNT(*) > 2 means count > 2 [OK]
Hint: HAVING COUNT(*) > N finds groups with more than N rows [OK]
Common Mistakes:
  • Thinking it finds exactly 2 instead of more than 2
  • Confusing WHERE and HAVING clauses
  • Ignoring GROUP BY effect
4. Identify the error in this query to find duplicate username values:
SELECT username FROM users WHERE COUNT(username) > 1 GROUP BY username;
medium
A. Missing ORDER BY clause
B. GROUP BY should come before WHERE
C. COUNT() cannot be used in WHERE clause
D. COUNT() should be COUNT(DISTINCT username)

Solution

  1. Step 1: Check WHERE clause usage

    WHERE cannot filter on aggregate functions like COUNT().
  2. Step 2: Correct clause to use HAVING

    HAVING is used to filter groups after GROUP BY with aggregates.
  3. Final Answer:

    COUNT() cannot be used in WHERE clause -> Option C
  4. Quick Check:

    Aggregates need HAVING, not WHERE [OK]
Hint: Use HAVING, not WHERE, to filter aggregates [OK]
Common Mistakes:
  • Using WHERE with aggregate functions
  • Placing GROUP BY after WHERE
  • Confusing COUNT() usage
5. You want to find duplicate 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?
hard
A. SELECT product_code, COUNT(*) AS count FROM inventory GROUP BY product_code HAVING count > 1;
B. SELECT product_code, COUNT(*) AS count FROM inventory WHERE COUNT(*) > 1 GROUP BY product_code;
C. SELECT product_code FROM inventory GROUP BY product_code HAVING COUNT(*) > 1 ORDER BY product_code;
D. SELECT product_code, COUNT(product_code) FROM inventory GROUP BY product_code WHERE COUNT(product_code) > 1;

Solution

  1. 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.
  2. Step 2: Verify alias usage and efficiency

    Using COUNT(*) AS count allows filtering with HAVING count > 1 efficiently and shows counts.
  3. Final Answer:

    SELECT product_code, COUNT(*) AS count FROM inventory GROUP BY product_code HAVING count > 1; -> Option A
  4. Quick Check:

    GROUP BY + HAVING with alias count shows duplicates and counts [OK]
Hint: Use HAVING with COUNT(*) alias to filter and show duplicates count [OK]
Common Mistakes:
  • Using WHERE with COUNT()
  • Placing WHERE after GROUP BY
  • Not selecting count to see duplicate frequency
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard