Bird
Raised Fist0
SQLquery~20 mins

INNER JOIN with ON condition in SQL - Practice Problems & Coding Challenges

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
Challenge - 5 Problems
🎖️
INNER JOIN Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
query_result
intermediate
2:00remaining
INNER JOIN with simple ON condition
Given two tables Employees and Departments, what is the result of the following query?
SQL
SELECT Employees.Name, Departments.DepartmentName FROM Employees INNER JOIN Departments ON Employees.DepartmentID = Departments.ID;
A[{"Name": "Alice", "DepartmentName": "HR"}, {"Name": "Bob", "DepartmentName": "Finance"}]
B[]
C[{"Name": "Alice"}, {"Name": "Bob"}]
D[{"Name": "Alice", "DepartmentName": "HR"}, {"Name": "Bob", "DepartmentName": "IT"}]
Attempts:
2 left
💡 Hint
Think about matching DepartmentID in Employees with ID in Departments.
📝 Syntax
intermediate
2:00remaining
Identify the syntax error in INNER JOIN
Which option contains a syntax error in the INNER JOIN statement?
SQL
SELECT * FROM Orders INNER JOIN Customers ON Orders.CustomerID = Customers.ID;
ASELECT * FROM Orders INNER JOIN Customers Orders.CustomerID = Customers.ID;
BSELECT * FROM Orders INNER JOIN Customers ON Orders.CustomerID = Customers.ID WHERE Orders.Amount > 100;
CSELECT * FROM Orders INNER JOIN Customers ON Orders.CustomerID = Customers.ID;
DSELECT * FROM Orders INNER JOIN Customers ON Orders.CustomerID = Customers.ID ORDER BY Customers.Name;
Attempts:
2 left
💡 Hint
Check for missing keywords or clauses in the JOIN syntax.
optimization
advanced
2:00remaining
Optimizing INNER JOIN with multiple conditions
Which query is the most efficient way to join Sales and Products tables on both ProductID and Region?
ASELECT * FROM Sales INNER JOIN Products ON Sales.ProductID = Products.ID WHERE Sales.Region = Products.Region;
BSELECT * FROM Sales INNER JOIN Products ON Sales.ProductID = Products.ID AND Sales.Region = Products.Region;
CSELECT * FROM Sales, Products WHERE Sales.ProductID = Products.ID AND Sales.Region = Products.Region;
DSELECT * FROM Sales INNER JOIN Products USING (ProductID, Region);
Attempts:
2 left
💡 Hint
Consider how join conditions affect query execution and filtering.
🧠 Conceptual
advanced
2:00remaining
Understanding INNER JOIN behavior with NULL values
What happens when you INNER JOIN two tables on a column that contains NULL values in one table?
ARows with NULL in the join column are excluded from the result.
BRows with NULL in the join column are included with NULLs in the joined columns.
CThe query returns an error due to NULL values in join columns.
DRows with NULL in the join column are matched with all rows in the other table.
Attempts:
2 left
💡 Hint
Think about how NULL compares in SQL join conditions.
🔧 Debug
expert
2:00remaining
Debugging unexpected INNER JOIN results
You run this query but get fewer rows than expected: SELECT Orders.OrderID, Customers.Name FROM Orders INNER JOIN Customers ON Orders.CustomerID = Customers.ID WHERE Customers.Country = 'USA'; What is the most likely reason?
AINNER JOIN does not work with WHERE clauses.
BThe WHERE clause filters out all rows because no Customers are from USA.
CSome Orders have CustomerID values that do not exist in Customers table.
DThe ON condition is incorrect; it should use Orders.ID = Customers.CustomerID.
Attempts:
2 left
💡 Hint
Consider how INNER JOIN and WHERE filtering interact.

Practice

(1/5)
1. What does an INNER JOIN do in SQL when used with an ON condition?
easy
A. It returns all rows from the first table regardless of matches.
B. It returns all rows from both tables, matching or not.
C. It returns all rows from the second table regardless of matches.
D. It returns only rows where the join condition matches in both tables.

Solution

  1. Step 1: Understand INNER JOIN behavior

    INNER JOIN returns rows only when the join condition matches rows in both tables.
  2. Step 2: Compare with other join types

    Unlike LEFT or RIGHT JOIN, INNER JOIN excludes rows without matches.
  3. Final Answer:

    It returns only rows where the join condition matches in both tables. -> Option D
  4. Quick Check:

    INNER JOIN = matching rows only [OK]
Hint: INNER JOIN keeps only matching rows from both tables [OK]
Common Mistakes:
  • Thinking INNER JOIN returns unmatched rows
  • Confusing INNER JOIN with LEFT JOIN
  • Ignoring the ON condition effect
2. Which of the following is the correct syntax for an INNER JOIN with an ON condition between tables Employees and Departments on DepartmentID?
easy
A. SELECT * FROM Employees INNER JOIN Departments ON Employees.DepartmentID = Departments.DepartmentID;
B. SELECT * FROM Employees INNER JOIN Departments ON Employees.ID = Departments.ID;
C. SELECT * FROM Employees JOIN Departments USING DepartmentID;
D. SELECT * FROM Employees INNER JOIN Departments WHERE Employees.DepartmentID = Departments.DepartmentID;

Solution

  1. Step 1: Identify correct INNER JOIN syntax

    The INNER JOIN requires the ON keyword followed by the join condition.
  2. Step 2: Check the join condition correctness

    The join should be on Employees.DepartmentID = Departments.DepartmentID, not just ID or WHERE clause.
  3. Final Answer:

    SELECT * FROM Employees INNER JOIN Departments ON Employees.DepartmentID = Departments.DepartmentID; -> Option A
  4. Quick Check:

    INNER JOIN uses ON with condition [OK]
Hint: Use ON keyword with join condition for INNER JOIN [OK]
Common Mistakes:
  • Using WHERE instead of ON for join condition
  • Joining on wrong columns
  • Omitting ON keyword
3. Given these tables:

Employees
ID | Name | DeptID
1 | Alice | 10
2 | Bob | 20
3 | Carol | 30

Departments
DeptID | DeptName
10 | Sales
20 | HR
40 | IT

What is the result of this query?
SELECT Employees.Name, Departments.DeptName FROM Employees INNER JOIN Departments ON Employees.DeptID = Departments.DeptID;
medium
A. [('Alice', 'Sales'), ('Bob', 'HR')]
B. [('Alice', 'Sales'), ('Bob', 'HR'), ('Carol', 'IT')]
C. [('Alice', 'Sales'), ('Carol', 'IT')]
D. [('Bob', 'HR'), ('Carol', 'IT')]

Solution

  1. Step 1: Match Employees.DeptID with Departments.DeptID

    Employees have DeptIDs 10, 20, 30; Departments have 10, 20, 40.
  2. Step 2: Find matching DeptIDs

    Matches are 10 and 20 only; 30 (Carol) has no matching department.
  3. Final Answer:

    [('Alice', 'Sales'), ('Bob', 'HR')] -> Option A
  4. Quick Check:

    INNER JOIN returns only matching DeptIDs [OK]
Hint: Only rows with matching DeptID appear in INNER JOIN result [OK]
Common Mistakes:
  • Including unmatched rows like Carol's
  • Confusing DeptID with ID
  • Assuming all departments join
4. Consider this query:
SELECT e.Name, d.DeptName FROM Employees e INNER JOIN Departments d ON e.DeptID = d.ID;

Given Departments has column DeptID but no ID column, what is the issue?
medium
A. The query will join on wrong columns but still return rows.
B. The query will run but return no rows.
C. The query will cause a syntax error due to wrong column name.
D. The query will join correctly because aliases fix column names.

Solution

  1. Step 1: Check column names in ON condition

    The query uses d.ID but Departments table has DeptID, not ID.
  2. Step 2: Understand SQL error on invalid column

    Referencing a non-existent column causes a syntax or runtime error.
  3. Final Answer:

    The query will cause a syntax error due to wrong column name. -> Option C
  4. Quick Check:

    Wrong column in ON causes error [OK]
Hint: Verify column names in ON condition to avoid errors [OK]
Common Mistakes:
  • Assuming aliases rename columns automatically
  • Using wrong column names in ON clause
  • Expecting empty result instead of error
5. You have two tables:

Orders
OrderID | CustomerID | Amount
1 | 101 | 50
2 | 102 | 75
3 | 103 | 100
4 | 101 | 25

Customers
CustomerID | Name
101 | John
102 | Jane
104 | Mike

Write an INNER JOIN query to find total order amount per customer name, including only customers with orders. Which query is correct?
hard
A. SELECT c.Name, SUM(o.Amount) FROM Customers c INNER JOIN Orders o ON c.CustomerID = o.CustomerID GROUP BY c.CustomerID;
B. SELECT c.Name, SUM(o.Amount) FROM Orders o INNER JOIN Customers c ON o.CustomerID = c.CustomerID GROUP BY c.Name;
C. SELECT c.Name, SUM(o.Amount) FROM Customers c LEFT JOIN Orders o ON c.CustomerID = o.CustomerID GROUP BY c.Name;
D. SELECT c.Name, SUM(o.Amount) FROM Orders o INNER JOIN Customers c ON o.CustomerID = c.CustomerID GROUP BY o.CustomerID;

Solution

  1. Step 1: Understand requirement - total per customer with orders only

    INNER JOIN keeps only customers with matching orders; GROUP BY customer name to sum amounts.
  2. Step 2: Check query correctness

    SELECT c.Name, SUM(o.Amount) FROM Orders o INNER JOIN Customers c ON o.CustomerID = c.CustomerID GROUP BY c.Name; joins Orders to Customers on CustomerID and groups by c.Name, matching requirement exactly.
  3. Step 3: Compare other options

    SELECT c.Name, SUM(o.Amount) FROM Customers c INNER JOIN Orders o ON c.CustomerID = o.CustomerID GROUP BY c.CustomerID; groups by CustomerID but c.Name not grouped (SQL error). SELECT c.Name, SUM(o.Amount) FROM Customers c LEFT JOIN Orders o ON c.CustomerID = o.CustomerID GROUP BY c.Name; uses LEFT JOIN (includes customers without orders). SELECT c.Name, SUM(o.Amount) FROM Orders o INNER JOIN Customers c ON o.CustomerID = c.CustomerID GROUP BY o.CustomerID; groups by o.CustomerID (not customer name).
  4. Final Answer:

    SELECT c.Name, SUM(o.Amount) FROM Orders o INNER JOIN Customers c ON o.CustomerID = c.CustomerID GROUP BY c.Name; -> Option B
  5. Quick Check:

    INNER JOIN with GROUP BY customer name sums orders [OK]
Hint: Join Orders to Customers, group by customer name for totals [OK]
Common Mistakes:
  • Using LEFT JOIN includes customers without orders
  • Grouping by wrong column
  • Joining tables in wrong order causing confusion