Bird
Raised Fist0
SQLquery~10 mins

LEFT JOIN with NULL result rows in SQL - Step-by-Step Execution

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
Concept Flow - LEFT JOIN with NULL result rows
Start with LEFT table
For each row in LEFT table
Find matching rows in RIGHT table
Match?
Fill RIGHT columns with NULL
Combine LEFT row with RIGHT row or NULLs
Add combined row to result
Repeat for all LEFT rows
END
The LEFT JOIN takes each row from the left table and tries to find matching rows in the right table. If no match is found, it fills the right side columns with NULL and still includes the left row in the result.
Execution Sample
SQL
SELECT A.id, A.name, B.order_id
FROM Customers A
LEFT JOIN Orders B ON A.id = B.customer_id;
This query lists all customers and their orders. Customers without orders show NULL in the order_id column.
Execution Table
StepCurrent LEFT row (Customers)Matching RIGHT rows (Orders)ActionResult row added
1Customer(id=1, name='Alice')Order(order_id=101, customer_id=1)Match found, combine rows(1, 'Alice', 101)
2Customer(id=2, name='Bob')No matching orderNo match, fill RIGHT columns with NULL(2, 'Bob', NULL)
3Customer(id=3, name='Charlie')Order(order_id=102, customer_id=3)Match found, combine rows(3, 'Charlie', 102)
4Customer(id=4, name='Diana')No matching orderNo match, fill RIGHT columns with NULL(4, 'Diana', NULL)
END---All LEFT rows processed
💡 All rows from Customers processed; unmatched rows have NULLs in Orders columns
Variable Tracker
VariableStartAfter 1After 2After 3After 4Final
Current LEFT rowNoneCustomer 1Customer 2Customer 3Customer 4None
Matching RIGHT rowsNoneOrder 101NoneOrder 102NoneNone
Result rows count012344
Key Moments - 2 Insights
Why do some rows have NULL values in the RIGHT table columns?
Because LEFT JOIN includes all rows from the LEFT table even if there is no matching row in the RIGHT table. When no match is found (see steps 2 and 4 in execution_table), the RIGHT columns are filled with NULL.
Does LEFT JOIN exclude any rows from the LEFT table?
No, LEFT JOIN always includes every row from the LEFT table regardless of matches in the RIGHT table, as shown by all LEFT rows appearing in the result (execution_table rows 1 to 4).
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table, what is the result row added at step 2?
A(2, 'Bob', 102)
B(2, 'Bob', NULL)
C(2, 'Bob', 101)
D(NULL, 'Bob', NULL)
💡 Hint
Check the 'Result row added' column at step 2 in the execution_table
At which step does the LEFT JOIN fill RIGHT columns with NULL because no match was found?
AStep 1
BStep 2
CStep 3
DStep 4
💡 Hint
Look at the 'Action' column in execution_table for steps with 'No match, fill RIGHT columns with NULL'
If a new customer with id=5 and no orders is added, how will the result rows count change?
AIt will decrease by 1
BIt will stay the same
CIt will increase by 1
DIt will double
💡 Hint
Refer to variable_tracker row 'Result rows count' and how LEFT JOIN includes all LEFT rows
Concept Snapshot
LEFT JOIN syntax:
SELECT columns
FROM LeftTable
LEFT JOIN RightTable ON condition;

Behavior:
- Includes all rows from LeftTable
- Matches rows from RightTable
- If no match, RightTable columns are NULL

Key rule: No LEFT row is dropped, unmatched RIGHT columns become NULL.
Full Transcript
This visual execution shows how a LEFT JOIN works in SQL. We start with each row from the left table (Customers). For each customer, the database looks for matching rows in the right table (Orders) based on the join condition (customer id). If a match is found, the rows are combined and added to the result. If no match is found, the left row is still included, but the right side columns are filled with NULL. This ensures all customers appear in the result, even those without orders. The execution table traces each step, showing which rows match and when NULLs appear. The variable tracker follows the current row and result count. Key moments clarify why NULLs appear and that no left rows are excluded. The quiz tests understanding of these steps. The snapshot summarizes the syntax and behavior for quick reference.

Practice

(1/5)
1. What does a LEFT JOIN do in SQL?
easy
A. Returns all rows from the left table and matched rows from the right table, NULL if no match.
B. Returns only rows that have matching values in both tables.
C. Returns all rows from the right table and matched rows from the left table.
D. Deletes rows from the left table that have no match in the right table.

Solution

  1. Step 1: Understand LEFT JOIN behavior

    A LEFT JOIN keeps all rows from the left table regardless of matches in the right table.
  2. Step 2: Identify NULLs for unmatched rows

    If there is no matching row in the right table, the result shows NULL for right table columns.
  3. Final Answer:

    Returns all rows from the left table and matched rows from the right table, NULL if no match. -> Option A
  4. Quick Check:

    LEFT JOIN = all left rows + NULL for no match [OK]
Hint: LEFT JOIN keeps all left rows, unmatched right rows show NULL [OK]
Common Mistakes:
  • Confusing LEFT JOIN with INNER JOIN
  • Thinking unmatched rows are dropped
  • Assuming NULLs appear in left table columns
2. Which of the following is the correct syntax for a LEFT JOIN in SQL?
easy
A. SELECT * FROM table1 LEFT OUTER JOIN table2 WHERE table1.id = table2.id;
B. SELECT * FROM table1 JOIN LEFT table2 ON table1.id = table2.id;
C. SELECT * FROM table1 LEFT JOIN table2 USING (id);
D. SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.id;

Solution

  1. Step 1: Review standard LEFT JOIN syntax

    The correct syntax is: SELECT columns FROM left_table LEFT JOIN right_table ON condition.
  2. Step 2: Check each option

    SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.id; matches the correct syntax exactly. SELECT * FROM table1 JOIN LEFT table2 ON table1.id = table2.id; has JOIN LEFT which is invalid. SELECT * FROM table1 LEFT OUTER JOIN table2 WHERE table1.id = table2.id; is invalid because JOIN requires an ON clause (syntax error). SELECT * FROM table1 LEFT JOIN table2 USING (id); is correct syntax with parentheses.
  3. Final Answer:

    SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.id; -> Option D
  4. Quick Check:

    LEFT JOIN syntax = LEFT JOIN ... ON ... [OK]
Hint: Use LEFT JOIN ... ON ... for correct syntax [OK]
Common Mistakes:
  • Swapping JOIN and LEFT keywords
  • Using WHERE instead of ON for join condition
  • Omitting parentheses in USING clause
3. Given tables Employees and Departments with data:

Employees:
id | name | dept_id
1 | Alice | 10
2 | Bob | 20
3 | Carol | NULL

Departments:
dept_id | dept_name
10 | Sales
20 | HR
30 | IT

What is the result of this query?
SELECT e.name, d.dept_name FROM Employees e LEFT JOIN Departments d ON e.dept_id = d.dept_id;
medium
A. [{"name": "Alice", "dept_name": "Sales"}, {"name": "Bob", "dept_name": "HR"}]
B. [{"name": "Alice", "dept_name": "Sales"}, {"name": "Bob", "dept_name": "HR"}, {"name": "Carol", "dept_name": null}]
C. [{"name": "Alice", "dept_name": "Sales"}, {"name": "Bob", "dept_name": "HR"}, {"name": "Carol", "dept_name": "IT"}]
D. [{"name": "Alice", "dept_name": null}, {"name": "Bob", "dept_name": null}, {"name": "Carol", "dept_name": null}]

Solution

  1. Step 1: Match Employees with Departments by dept_id

    Alice's dept_id 10 matches Sales, Bob's 20 matches HR, Carol's NULL has no match.
  2. Step 2: Apply LEFT JOIN behavior

    All employees appear. For Carol, no matching department, so dept_name is NULL.
  3. Final Answer:

    [{"name": "Alice", "dept_name": "Sales"}, {"name": "Bob", "dept_name": "HR"}, {"name": "Carol", "dept_name": null}] -> Option B
  4. Quick Check:

    LEFT JOIN keeps all left rows, unmatched right columns NULL [OK]
Hint: LEFT JOIN shows NULL for unmatched right table rows [OK]
Common Mistakes:
  • Omitting rows with NULL join keys
  • Assuming unmatched rows get default values
  • Confusing INNER JOIN output with LEFT JOIN
4. Consider this SQL query:
SELECT a.id, b.value FROM A a LEFT JOIN B b ON a.id = b.a_id WHERE b.value > 10;

Why might this query return fewer rows than table A has?
medium
A. Because the query syntax is invalid and causes an error.
B. Because LEFT JOIN only returns rows with matching b.value > 10.
C. Because the WHERE clause filters out rows where b.value is NULL, removing unmatched rows.
D. Because the ON condition is incorrect and causes no matches.

Solution

  1. Step 1: Understand LEFT JOIN with WHERE filter

    LEFT JOIN keeps all rows from A, but WHERE filters after join.
  2. Step 2: Effect of WHERE on NULLs from unmatched rows

    Rows with no match have b.value as NULL, and WHERE b.value > 10 excludes NULLs, removing those rows.
  3. Final Answer:

    Because the WHERE clause filters out rows where b.value is NULL, removing unmatched rows. -> Option C
  4. Quick Check:

    WHERE filters NULLs after LEFT JOIN, reducing rows [OK]
Hint: WHERE on right table column after LEFT JOIN filters out NULLs [OK]
Common Mistakes:
  • Thinking LEFT JOIN always keeps all left rows regardless of WHERE
  • Confusing ON and WHERE filtering effects
  • Assuming query syntax error causes fewer rows
5. You have two tables:

Orders:
order_id | customer_id
1 | 101
2 | 102
3 | 103

Customers:
customer_id | name
101 | John
102 | Jane

You want to list all orders with customer names, but show 'Unknown' if no customer found.

Which SQL query correctly achieves this?
hard
A. SELECT o.order_id, COALESCE(c.name, 'Unknown') AS customer_name FROM Orders o LEFT JOIN Customers c ON o.customer_id = c.customer_id;
B. SELECT o.order_id, IFNULL(c.name, 'Unknown') AS customer_name FROM Orders o INNER JOIN Customers c ON o.customer_id = c.customer_id;
C. SELECT o.order_id, c.name FROM Orders o RIGHT JOIN Customers c ON o.customer_id = c.customer_id;
D. SELECT o.order_id, CASE WHEN c.name IS NULL THEN 'Unknown' ELSE c.name END FROM Orders o JOIN Customers c ON o.customer_id = c.customer_id;

Solution

  1. Step 1: Use LEFT JOIN to keep all orders

    LEFT JOIN keeps all orders even if no matching customer exists.
  2. Step 2: Replace NULL customer names with 'Unknown'

    Use COALESCE to show 'Unknown' when c.name is NULL.
  3. Final Answer:

    SELECT o.order_id, COALESCE(c.name, 'Unknown') AS customer_name FROM Orders o LEFT JOIN Customers c ON o.customer_id = c.customer_id; -> Option A
  4. Quick Check:

    LEFT JOIN + COALESCE handles missing customers [OK]
Hint: Use LEFT JOIN with COALESCE to replace NULLs [OK]
Common Mistakes:
  • Using INNER JOIN excludes orders without customers
  • Using RIGHT JOIN reverses table roles incorrectly
  • Forgetting to handle NULL customer names