Subquery vs JOIN performance trade-off in SQL - Performance Comparison
Start learning this pattern below
Jump into concepts and practice - no test required
When working with databases, we often choose between subqueries and JOINs to combine data from tables.
We want to understand how the time to run these queries grows as the data gets bigger.
Analyze the time complexity of these two queries that get orders with customer info.
-- Using a subquery
SELECT order_id, customer_name
FROM orders
WHERE customer_id IN (SELECT customer_id FROM customers WHERE active = 1);
-- Using a JOIN
SELECT o.order_id, c.customer_name
FROM orders o
JOIN customers c ON o.customer_id = c.customer_id
WHERE c.active = 1;
Both queries find orders from active customers, but use different ways to combine tables.
Look at what repeats as data grows:
- Primary operation: Checking each order against customers.
- How many times: Once for each order row, plus scanning customers.
As the number of orders and customers grows, the work increases.
| Input Size (orders n) | Approx. Operations |
|---|---|
| 10 | About 10 checks plus customer scans |
| 100 | About 100 checks plus customer scans |
| 1000 | About 1000 checks plus customer scans |
Pattern observation: The work grows roughly in proportion to the number of orders and customers.
Time Complexity: O(n * m)
This means the time grows roughly by multiplying the number of orders (n) by the number of customers (m).
[X] Wrong: "JOINs are always faster than subqueries."
[OK] Correct: Sometimes subqueries can be optimized by the database to run as fast or faster, depending on indexes and query structure.
Understanding how query time grows helps you write better database code and explain your choices clearly in conversations.
"What if we add an index on customer_id in both tables? How would that affect the time complexity?"
Practice
JOIN and a subquery in SQL?Solution
Step 1: Understand how JOINs work
JOINs combine rows from two or more tables in one operation, which is often optimized by the database engine.Step 2: Compare with subqueries
Subqueries run separately and then feed results to the main query, which can be slower especially with large data.Final Answer:
JOINs generally perform better because they combine tables in a single step. -> Option AQuick Check:
JOIN performance > Subquery performance [OK]
- Thinking subqueries always run faster
- Assuming JOINs and subqueries are always equal
- Believing subqueries use less memory
Solution
Step 1: Check JOIN syntax
Correct JOIN syntax uses ON with matching keys:customers.id = orders.customer_id.Step 2: Validate each option
SELECT customers.name, orders.id FROM customers JOIN orders ON customers.id = orders.customer_id; uses correct JOIN and ON condition. SELECT customers.name, orders.id FROM customers WHERE customers.id = orders.customer_id; uses WHERE without JOIN, which is invalid here. SELECT customers.name, orders.id FROM customers, orders WHERE customers.id == orders.customer_id; uses double equals (==) which is invalid in SQL. SELECT customers.name, orders.id FROM customers JOIN orders ON customers.customer_id = orders.id; reverses keys incorrectly.Final Answer:
SELECT customers.name, orders.id FROM customers JOIN orders ON customers.id = orders.customer_id; -> Option AQuick Check:
Correct JOIN syntax = SELECT customers.name, orders.id FROM customers JOIN orders ON customers.id = orders.customer_id; [OK]
- Using WHERE instead of ON for JOIN condition
- Using == instead of = in SQL
- Mixing up key columns in ON clause
employees(id, name) and departments(id, name, manager_id), what will this query return?SELECT e.name FROM employees e WHERE e.id IN (SELECT d.manager_id FROM departments d);
Solution
Step 1: Understand the subquery
The subquerySELECT d.manager_id FROM departments dreturns all manager IDs from departments.Step 2: Analyze the main query
The main query selects employee names where their ID is in the list of manager IDs, so it returns employees who manage departments.Final Answer:
Names of employees who are managers of any department. -> Option DQuick Check:
Subquery filters managers = Names of employees who are managers of any department. [OK]
- Thinking it returns all employees
- Confusing managers with non-managers
- Assuming syntax error in subquery
SELECT c.name, o.amount FROM customers c JOIN orders o WHERE c.id = o.customer_id;
Solution
Step 1: Review JOIN syntax
JOIN requires an ON clause to specify join condition, not WHERE.Step 2: Check the query
The query uses WHERE for join condition, which is incorrect syntax for explicit JOIN.Final Answer:
Missing ON keyword before join condition. -> Option CQuick Check:
JOIN needs ON, not WHERE [OK]
- Using WHERE instead of ON for JOIN
- Confusing HAVING with WHERE
- Assuming aliases cause error
products table has category_id, and the categories table has id and name. Which approach is better for performance and why?Options:
A) Use a JOIN to combine
products and categories.B) Use a subquery in SELECT to get category name for each product.
C) Use a subquery in WHERE to filter products by category name.
D) Use UNION to combine products and categories.
Solution
Step 1: Understand the data retrieval goal
You want product info with category names, which requires combining data from two tables.Step 2: Compare approaches
JOIN combines tables in one efficient operation. Subqueries in SELECT run once per row, causing slower performance. Subquery in WHERE filters but doesn't retrieve category names. UNION merges rows, not related here.Final Answer:
JOIN is better because it retrieves all data in one step efficiently. -> Option BQuick Check:
JOIN efficiency > subqueries for this task [OK]
- Using subquery in SELECT causing slow per-row lookup
- Confusing UNION with JOIN
- Using subquery in WHERE without retrieving needed data
