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
Finding unmatched rows with LEFT JOIN
📖 Scenario: You work at a small bookstore. You have two tables: books and sales. The books table lists all books in the store. The sales table records which books have been sold.You want to find books that have never been sold yet.
🎯 Goal: Create a SQL query that finds all books from the books table that do not have matching entries in the sales table using a LEFT JOIN.
📋 What You'll Learn
Create a books table with columns book_id and title and insert 3 books with IDs 1, 2, 3 and titles 'Book A', 'Book B', 'Book C'.
Create a sales table with columns sale_id and book_id and insert 2 sales for books 1 and 2.
Write a LEFT JOIN query joining books and sales on book_id.
Filter the results to show only books with no matching sales (unmatched rows).
💡 Why This Matters
🌍 Real World
Finding unmatched rows is useful in real life to identify missing or incomplete data, such as customers who never made a purchase or products never sold.
💼 Career
Database developers and analysts often use LEFT JOIN with NULL filtering to find gaps in data, which helps in reporting, data cleaning, and business decisions.
Progress0 / 4 steps
1
Create the books table and insert data
Write SQL statements to create a table called books with columns book_id (integer) and title (text). Insert these exact rows: (1, 'Book A'), (2, 'Book B'), and (3, 'Book C').
SQL
Hint
Use CREATE TABLE books (book_id INTEGER, title TEXT); to create the table.
Use INSERT INTO books (book_id, title) VALUES (...); to add each book.
2
Create the sales table and insert data
Write SQL statements to create a table called sales with columns sale_id (integer) and book_id (integer). Insert these exact rows: (1, 1) and (2, 2) representing sales of books 1 and 2.
SQL
Hint
Use CREATE TABLE sales (sale_id INTEGER, book_id INTEGER); to create the table.
Use INSERT INTO sales (sale_id, book_id) VALUES (...); to add each sale.
3
Write a LEFT JOIN query to join books and sales
Write a SQL query that selects books.book_id and books.title from the books table left joined with the sales table on books.book_id = sales.book_id.
SQL
Hint
Use LEFT JOIN sales ON books.book_id = sales.book_id to join the tables.
Select books.book_id and books.title.
4
Filter to find books with no matching sales
Add a WHERE clause to the previous query to select only rows where sales.book_id is NULL. This shows books that have no sales.
SQL
Hint
Use WHERE sales.book_id IS NULL to find books without sales.
Practice
(1/5)
1. What does a LEFT JOIN combined with WHERE right_table.key IS NULL do in SQL?
easy
A. Finds rows in the right table that have no matching rows in the left table
B. Finds rows in the left table that have no matching rows in the right table
C. Returns all rows from both tables regardless of matches
D. Deletes unmatched rows from the left table
Solution
Step 1: Understand LEFT JOIN behavior
A LEFT JOIN returns all rows from the left table and matching rows from the right table. If no match exists, right table columns are NULL.
Step 2: Apply WHERE condition to filter unmatched rows
Filtering with WHERE right_table.key IS NULL selects only those left table rows without a match in the right table.
Final Answer:
Finds rows in the left table that have no matching rows in the right table -> Option B
Quick Check:
LEFT JOIN + IS NULL = unmatched left rows [OK]
Hint: LEFT JOIN + IS NULL filters unmatched left table rows [OK]
Common Mistakes:
Confusing unmatched rows as from right table
Using INNER JOIN instead of LEFT JOIN
Not checking for NULL in right table columns
2. Which of the following SQL queries correctly finds customers without orders using LEFT JOIN?
easy
A. SELECT c.id FROM customers c RIGHT JOIN orders o ON c.id = o.customer_id WHERE c.id IS NULL;
B. SELECT c.id FROM customers c INNER JOIN orders o ON c.id = o.customer_id WHERE o.customer_id IS NULL;
C. SELECT c.id FROM customers c LEFT JOIN orders o ON c.id = o.customer_id WHERE c.id IS NULL;
D. SELECT c.id FROM customers c LEFT JOIN orders o ON c.id = o.customer_id WHERE o.customer_id IS NULL;
Solution
Step 1: Identify correct JOIN type
LEFT JOIN keeps all customers and matches orders; unmatched orders will be NULL.
Step 2: Filter unmatched orders
WHERE o.customer_id IS NULL selects customers without orders.
Final Answer:
SELECT c.id FROM customers c LEFT JOIN orders o ON c.id = o.customer_id WHERE o.customer_id IS NULL; -> Option D
Quick Check:
LEFT JOIN + right table NULL = unmatched left rows [OK]
Hint: Use LEFT JOIN and check right table key IS NULL [OK]
Common Mistakes:
Using INNER JOIN which excludes unmatched rows
Checking NULL on left table columns
Using RIGHT JOIN incorrectly for this case
3. Given tables employees(id, name) and tasks(employee_id, task_name), what does this query return?
SELECT e.name FROM employees e LEFT JOIN tasks t ON e.id = t.employee_id WHERE t.employee_id IS NULL;
medium
A. Names of employees who have no tasks assigned
B. Names of employees who have at least one task
C. All employee names regardless of tasks
D. Names of tasks without employees
Solution
Step 1: Analyze LEFT JOIN and ON condition
The query joins employees with tasks on employee ID, keeping all employees.
Step 2: Filter rows where tasks are missing
WHERE t.employee_id IS NULL selects employees with no matching tasks.
Final Answer:
Names of employees who have no tasks assigned -> Option A
Quick Check:
LEFT JOIN + NULL in right table = unmatched left rows [OK]
Hint: LEFT JOIN + right key NULL = unmatched left rows [OK]
Common Mistakes:
Thinking it returns employees with tasks
Confusing NULL check on left table
Assuming INNER JOIN behavior
4. Identify the error in this query intended to find products without sales:
SELECT p.product_id FROM products p LEFT JOIN sales s ON p.product_id = s.product_id WHERE p.product_id IS NULL;
medium
A. ON condition is incorrect, should join on sales_id
B. LEFT JOIN should be INNER JOIN
C. The WHERE clause should check s.product_id IS NULL, not p.product_id
D. Query is correct and will return unmatched products
Solution
Step 1: Understand LEFT JOIN result
LEFT JOIN keeps all products; unmatched sales columns are NULL.
Step 2: Check WHERE clause correctness
Filtering on p.product_id IS NULL is wrong because left table columns are never NULL in LEFT JOIN; should check s.product_id IS NULL.
Final Answer:
The WHERE clause should check s.product_id IS NULL, not p.product_id -> Option C
Quick Check:
Filter NULL on right table columns, not left [OK]
Hint: Check NULL on right table columns after LEFT JOIN [OK]
Common Mistakes:
Checking NULL on left table columns
Using INNER JOIN instead of LEFT JOIN
Incorrect ON join condition
5. You have tables students(id, name) and enrollments(student_id, course_id). Write a query to find students not enrolled in any course, considering some students may have NULL IDs. Which query correctly handles this?
hard
A. SELECT s.name FROM students s LEFT JOIN enrollments e ON s.id = e.student_id WHERE e.student_id IS NULL AND s.id IS NOT NULL;
B. SELECT s.name FROM students s RIGHT JOIN enrollments e ON s.id = e.student_id WHERE s.id IS NULL;
C. SELECT s.name FROM students s INNER JOIN enrollments e ON s.id = e.student_id WHERE s.id IS NULL;
D. SELECT s.name FROM students s LEFT JOIN enrollments e ON s.id = e.student_id WHERE e.student_id IS NULL;
Solution
Step 1: Use LEFT JOIN to find unmatched students
LEFT JOIN students with enrollments keeps all students; unmatched enrollments are NULL.
Step 2: Filter students without enrollments and exclude NULL student IDs
WHERE e.student_id IS NULL finds students without courses; adding s.id IS NOT NULL excludes students with NULL IDs to avoid incorrect matches.
Final Answer:
SELECT s.name FROM students s LEFT JOIN enrollments e ON s.id = e.student_id WHERE e.student_id IS NULL AND s.id IS NOT NULL; -> Option A
Quick Check:
LEFT JOIN + right NULL + exclude NULL left keys = correct unmatched [OK]
Hint: Exclude NULL keys on left table when filtering unmatched [OK]