LEFT JOIN preserving all left rows in SQL - Time & Space Complexity
Start learning this pattern below
Jump into concepts and practice - no test required
When using a LEFT JOIN in SQL, we want to keep all rows from the left table, even if there is no matching row in the right table.
We ask: How does the time to run this query grow as the tables get bigger?
Analyze the time complexity of the following SQL LEFT JOIN query.
SELECT a.id, a.name, b.order_date
FROM customers a
LEFT JOIN orders b ON a.id = b.customer_id;
This query returns all customers and their orders if any, keeping all customers even if they have no orders.
Look for repeated work done by the database engine.
- Primary operation: For each row in the left table (customers), the database looks for matching rows in the right table (orders).
- How many times: This matching happens once per left table row, so as many times as there are customers.
As the number of customers grows, the database must check more rows to find matches in orders.
| Input Size (customers) | Approx. Operations |
|---|---|
| 10 | About 10 lookups in orders |
| 100 | About 100 lookups in orders |
| 1000 | About 1000 lookups in orders |
Pattern observation: The work grows roughly in direct proportion to the number of customers.
Time Complexity: O(n)
This means the time to run the query grows linearly with the number of rows in the left table.
[X] Wrong: "The LEFT JOIN will check every row in both tables against each other, so it's quadratic time."
[OK] Correct: The database uses indexes or efficient lookups on the join column, so it doesn't scan the entire right table for each left row.
Understanding how LEFT JOIN scales helps you explain query performance clearly and shows you know how databases handle joins efficiently.
"What if the right table has no index on the join column? How would the time complexity change?"
Practice
LEFT JOIN do in SQL?Solution
Step 1: Understand LEFT JOIN behavior
A LEFT JOIN returns all rows from the left table regardless of matches in the right table.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.Final Answer:
Keeps all rows from the left table and adds matching rows from the right table or NULL if no match. -> Option DQuick Check:
LEFT JOIN = all left rows kept [OK]
- Confusing LEFT JOIN with INNER JOIN
- Thinking it keeps all right table rows
- Assuming unmatched rows are dropped
Solution
Step 1: Review correct LEFT JOIN syntax
The correct syntax is: SELECT columns FROM left_table LEFT JOIN right_table ON condition;Step 2: Identify syntax errors in other options
Options A, B, and D misuse keywords or omit ON clause, causing syntax errors.Final Answer:
SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.id; -> Option CQuick Check:
LEFT JOIN syntax = SELECT ... LEFT JOIN ... ON ... [OK]
- Swapping JOIN and LEFT keywords
- Using WHERE instead of ON for join condition
- Omitting ON clause
Employeesid | name
1 | Alice
2 | Bob
3 | Carol
Salesemp_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;Solution
Step 1: Match Employees with Sales using LEFT JOIN
All Employees rows appear. For matching emp_id in Sales, amount is shown; else NULL.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.Final Answer:
[('Alice', 100), ('Bob', NULL), ('Carol', 200)] -> Option BQuick Check:
LEFT JOIN keeps all left rows with NULL for no match [OK]
- Replacing NULL with zero
- Omitting unmatched rows
- Confusing LEFT JOIN with INNER JOIN
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?
Solution
Step 1: Understand effect of WHERE on LEFT JOIN
WHERE filters after join, so rows with NULL b.value are removed, losing left rows.Step 2: Identify how to fix to keep all left rows
Move condition to ON clause or useWHERE b.value > 10 OR b.value IS NULLto preserve unmatched rows.Final Answer:
The WHERE clause filters out rows where b.value is NULL, losing some left rows. -> Option AQuick Check:
WHERE after LEFT JOIN can remove unmatched rows [OK]
- Assuming WHERE doesn't affect LEFT JOIN results
- Confusing ON and WHERE clauses
- Replacing LEFT JOIN with INNER JOIN unnecessarily
Productsproduct_id | name
1 | Pen
2 | Pencil
3 | Eraser
Salesproduct_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.
Solution
Step 1: Use LEFT JOIN to keep all products
LEFT JOIN ensures all products appear even if no sales exist.Step 2: Use COALESCE with SUM to show 0 for no sales
SUM returns NULL if no matching rows; COALESCE converts NULL to 0.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 AQuick Check:
LEFT JOIN + COALESCE(SUM()) = total sales with zeros [OK]
- Using INNER JOIN losing products with no sales
- Not handling NULL sums with COALESCE
- Filtering in WHERE removing unmatched rows
