Bird
Raised Fist0
SQLquery~10 mins

LEFT JOIN preserving all left 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 preserving all left rows
Start with LEFT table
For each row in LEFT table
Find matching rows in RIGHT table
Combine LEFT and RIGHT row
Combine LEFT row with NULLs for RIGHT
Add combined row to result
Repeat for all LEFT rows
Result: All LEFT rows preserved
LEFT JOIN keeps every row from the left table and adds matching rows from the right table or NULL if no match.
Execution Sample
SQL
SELECT A.id, A.name, B.score
FROM A
LEFT JOIN B ON A.id = B.id;
This query joins tables A and B on id, keeping all rows from A and adding scores from B or NULL if no match.
Execution Table
StepLeft Table RowRight Table Matching RowsActionOutput Row
1A.id=1, A.name='Alice'B.id=1, B.score=90Match found, combine rows1, 'Alice', 90
2A.id=2, A.name='Bob'No matchNo match, combine with NULLs2, 'Bob', NULL
3A.id=3, A.name='Carol'B.id=3, B.score=85Match found, combine rows3, 'Carol', 85
4A.id=4, A.name='Dave'No matchNo match, combine with NULLs4, 'Dave', NULL
5All rows processedEnd of joinResult complete with all left rows
💡 All rows from left table A processed; right table B rows matched or NULLs added.
Variable Tracker
VariableStartAfter 1After 2After 3After 4Final
Current Left RowNoneid=1, name='Alice'id=2, name='Bob'id=3, name='Carol'id=4, name='Dave'All processed
Matching Right RowsNoneid=1, score=90Noneid=3, score=85NoneN/A
Output Rows Count012344
Key Moments - 2 Insights
Why do some output rows have NULL values in the right table columns?
When no matching row is found in the right table for a left row (see execution_table rows 2 and 4), LEFT JOIN fills right table columns with NULL to preserve the left row.
Does LEFT JOIN remove any rows from the left table?
No, LEFT JOIN always keeps all rows from the left table, as shown by the output rows count increasing each step and all left rows appearing in the output.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table at step 2, what is the output row?
A2, 'Bob', NULL
B2, 'Bob', 90
CNULL, 'Bob', NULL
D2, NULL, NULL
💡 Hint
Check the 'Output Row' column at step 2 in execution_table.
At which step does the LEFT JOIN add a row with NULLs for the right table columns?
AStep 1
BStep 2
CStep 3
DStep 5
💡 Hint
Look for 'No match, combine with NULLs' in the 'Action' column of execution_table.
If table B had a matching row for A.id=2, how would the output rows count change after step 2?
AIt would increase
BIt would decrease
CIt would stay the same
DIt would be zero
💡 Hint
Output rows count increases by one each left row processed regardless of match, see variable_tracker.
Concept Snapshot
LEFT JOIN syntax:
SELECT columns FROM left_table
LEFT JOIN right_table ON condition;

Behavior:
- Keeps all rows from left_table
- Adds matching right_table rows
- Uses NULLs if no match

Key rule: No left rows are lost.
Full Transcript
LEFT JOIN is a way to combine two tables in SQL. It keeps every row from the left table and tries to find matching rows in the right table based on a condition. If a match is found, it combines the data from both tables. If no match is found, it still keeps the left row but fills the right table columns with NULL. This ensures no rows from the left table are lost. The example query selects id and name from table A and score from table B, joining on id. The execution steps show each left row checked, matched or not, and added to the result. This visual helps understand how LEFT JOIN preserves all left rows.

Practice

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

Solution

  1. Step 1: Understand LEFT JOIN behavior

    A LEFT JOIN returns all rows from the left table regardless of matches in the right table.
  2. Step 2: Check what happens with unmatched rows

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

    Keeps all rows from the left table and adds matching rows from the right table or NULL if no match. -> Option D
  4. Quick Check:

    LEFT JOIN = all left rows kept [OK]
Hint: Remember: LEFT JOIN keeps all left rows, fills right with NULL if no match [OK]
Common Mistakes:
  • Confusing LEFT JOIN with INNER JOIN
  • Thinking it keeps all right table rows
  • Assuming unmatched rows are dropped
2. Which of the following is the correct syntax for a LEFT JOIN in SQL?
easy
A. SELECT * FROM table1 LEFT ON 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 ON table1.id = table2.id;
D. SELECT * FROM table1 LEFT JOIN table2 WHERE table1.id = table2.id;

Solution

  1. Step 1: Review correct LEFT JOIN syntax

    The correct syntax is: SELECT columns FROM left_table LEFT JOIN right_table ON condition;
  2. Step 2: Identify syntax errors in other options

    Options A, B, and D misuse keywords or omit ON clause, causing syntax errors.
  3. Final Answer:

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

    LEFT JOIN syntax = SELECT ... LEFT JOIN ... ON ... [OK]
Hint: LEFT JOIN always uses ON to specify join condition [OK]
Common Mistakes:
  • Swapping JOIN and LEFT keywords
  • Using WHERE instead of ON for join condition
  • Omitting ON clause
3. Given these tables:

Employees
id | name
1 | Alice
2 | Bob
3 | Carol

Sales
emp_id | amount
1 | 100
3 | 200

What is the result of:
SELECT Employees.name, Sales.amount FROM Employees LEFT JOIN Sales ON Employees.id = Sales.emp_id;
medium
A. [('Alice', 100), ('Bob', 0), ('Carol', 200)]
B. [('Alice', 100), ('Bob', NULL), ('Carol', 200)]
C. [('Alice', 100), ('Carol', 200)]
D. [('Bob', NULL)]

Solution

  1. Step 1: Match Employees with Sales using LEFT JOIN

    All Employees rows appear. For matching emp_id in Sales, amount is shown; else NULL.
  2. Step 2: Map each employee to sales amount or NULL

    Alice (id=1) matches 100, Bob (id=2) no match so NULL, Carol (id=3) matches 200.
  3. Final Answer:

    [('Alice', 100), ('Bob', NULL), ('Carol', 200)] -> Option B
  4. Quick Check:

    LEFT JOIN keeps all left rows with NULL for no match [OK]
Hint: LEFT JOIN shows NULL for unmatched right rows, not zero [OK]
Common Mistakes:
  • Replacing NULL with zero
  • Omitting unmatched rows
  • Confusing LEFT JOIN with INNER JOIN
4. Consider this query:

SELECT a.id, b.value FROM A LEFT JOIN B ON a.id = b.a_id WHERE b.value > 10;

What is the problem with this query if you want to keep all rows from A?
medium
A. The WHERE clause filters out rows where b.value is NULL, losing some left rows.
B. The ON clause is missing a join condition.
C. LEFT JOIN should be replaced with INNER JOIN for correct results.
D. The SELECT statement is missing table aliases.

Solution

  1. Step 1: Understand effect of WHERE on LEFT JOIN

    WHERE filters after join, so rows with NULL b.value are removed, losing left rows.
  2. Step 2: Identify how to fix to keep all left rows

    Move condition to ON clause or use WHERE b.value > 10 OR b.value IS NULL to preserve unmatched rows.
  3. Final Answer:

    The WHERE clause filters out rows where b.value is NULL, losing some left rows. -> Option A
  4. Quick Check:

    WHERE after LEFT JOIN can remove unmatched rows [OK]
Hint: Put filters on right table in ON, not WHERE, to keep all left rows [OK]
Common Mistakes:
  • Assuming WHERE doesn't affect LEFT JOIN results
  • Confusing ON and WHERE clauses
  • Replacing LEFT JOIN with INNER JOIN unnecessarily
5. You have two tables:

Products
product_id | name
1 | Pen
2 | Pencil
3 | Eraser

Sales
product_id | quantity
1 | 10
1 | 5
3 | 7

Write a query using LEFT JOIN to get each product's total sales quantity, showing 0 if no sales exist.
hard
A. SELECT p.name, COALESCE(SUM(s.quantity), 0) AS total FROM Products p LEFT JOIN Sales s ON p.product_id = s.product_id GROUP BY p.name;
B. SELECT p.name, SUM(s.quantity) AS total FROM Products p INNER JOIN Sales s ON p.product_id = s.product_id GROUP BY p.name;
C. SELECT p.name, SUM(s.quantity) AS total FROM Products p LEFT JOIN Sales s ON p.product_id = s.product_id WHERE s.quantity > 0 GROUP BY p.name;
D. SELECT p.name, SUM(s.quantity) AS total FROM Sales s LEFT JOIN Products p ON s.product_id = p.product_id GROUP BY p.name;

Solution

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

    LEFT JOIN ensures all products appear even if no sales exist.
  2. Step 2: Use COALESCE with SUM to show 0 for no sales

    SUM returns NULL if no matching rows; COALESCE converts NULL to 0.
  3. Final Answer:

    SELECT p.name, COALESCE(SUM(s.quantity), 0) AS total FROM Products p LEFT JOIN Sales s ON p.product_id = s.product_id GROUP BY p.name; -> Option A
  4. Quick Check:

    LEFT JOIN + COALESCE(SUM()) = total sales with zeros [OK]
Hint: Use COALESCE(SUM()) with LEFT JOIN to replace NULL totals with zero [OK]
Common Mistakes:
  • Using INNER JOIN losing products with no sales
  • Not handling NULL sums with COALESCE
  • Filtering in WHERE removing unmatched rows