We want to get data from multiple tables efficiently. Sometimes we use subqueries, other times JOINs. Knowing which is faster helps your database work better.
Subquery vs JOIN performance trade-off in SQL
Start learning this pattern below
Jump into concepts and practice - no test required
or
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Introduction
Syntax
SQL
-- Subquery example SELECT column1 FROM table1 WHERE column2 IN (SELECT column2 FROM table2); -- JOIN example SELECT t1.column1, t2.column2 FROM table1 t1 JOIN table2 t2 ON t1.column2 = t2.column2;
Subqueries run inside another query and can be simple or complex.
JOINs combine rows from two tables based on a related column.
Examples
SQL
SELECT name FROM employees WHERE department_id IN (SELECT id FROM departments WHERE location = 'NY');
SQL
SELECT e.name, d.location FROM employees e JOIN departments d ON e.department_id = d.id WHERE d.location = 'NY';
SQL
SELECT name FROM employees WHERE EXISTS (SELECT 1 FROM departments WHERE id = employees.department_id AND location = 'NY');
Sample Program
This example shows two ways to get employees working in NY departments: one with a subquery and one with a JOIN.
SQL
CREATE TABLE departments (id INT, location VARCHAR(20)); CREATE TABLE employees (id INT, name VARCHAR(20), department_id INT); INSERT INTO departments VALUES (1, 'NY'), (2, 'LA'); INSERT INTO employees VALUES (1, 'Alice', 1), (2, 'Bob', 2), (3, 'Carol', 1); -- Using subquery SELECT name FROM employees WHERE department_id IN (SELECT id FROM departments WHERE location = 'NY'); -- Using JOIN SELECT e.name FROM employees e JOIN departments d ON e.department_id = d.id WHERE d.location = 'NY';
Important Notes
JOINs often perform better than subqueries because databases optimize them well.
Subqueries can be easier to read for simple filters but might be slower on large data.
Always test both methods on your data to see which is faster.
Summary
Subqueries and JOINs both get data from multiple tables.
JOINs usually run faster but can be more complex to write.
Choose based on readability and performance for your situation.
Practice
1. Which statement best describes the performance difference between a
JOIN and a subquery in SQL?easy
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]
Hint: JOINs usually run faster than subqueries [OK]
Common Mistakes:
- Thinking subqueries always run faster
- Assuming JOINs and subqueries are always equal
- Believing subqueries use less memory
2. Which of the following SQL queries correctly uses a JOIN to get all customers and their orders?
easy
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]
Hint: JOIN uses ON with matching keys, not WHERE or == [OK]
Common Mistakes:
- Using WHERE instead of ON for JOIN condition
- Using == instead of = in SQL
- Mixing up key columns in ON clause
3. Given the tables
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);
medium
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]
Hint: IN with subquery filters matching IDs [OK]
Common Mistakes:
- Thinking it returns all employees
- Confusing managers with non-managers
- Assuming syntax error in subquery
4. Identify the error in this SQL query that uses a JOIN:
SELECT c.name, o.amount FROM customers c JOIN orders o WHERE c.id = o.customer_id;
medium
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]
Hint: JOIN must have ON clause for conditions [OK]
Common Mistakes:
- Using WHERE instead of ON for JOIN
- Confusing HAVING with WHERE
- Assuming aliases cause error
5. You want to list all products and their category names. The
Options:
A) Use a JOIN to combine
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.
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.
hard
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]
Hint: JOIN combines tables efficiently for related data [OK]
Common Mistakes:
- Using subquery in SELECT causing slow per-row lookup
- Confusing UNION with JOIN
- Using subquery in WHERE without retrieving needed data
