We use subqueries and JOINs to get data from multiple tables. They help us combine information in different ways to answer questions.
Subqueries vs JOINs comparison in MySQL
SELECT columns FROM table1 JOIN table2 ON table1.column = table2.column; -- OR -- SELECT columns FROM table1 WHERE column IN (SELECT column FROM table2 WHERE condition);
JOIN combines rows from two tables based on a related column.
Subquery is a query inside another query, used to filter or calculate values.
SELECT customers.name, orders.id FROM customers JOIN orders ON customers.id = orders.customer_id;
SELECT name FROM customers WHERE id IN (SELECT customer_id FROM orders);
SELECT name FROM customers WHERE id = (SELECT customer_id FROM orders WHERE id = 101);
This example creates two tables: customers and orders. It shows how to get customer names with their orders using JOIN and how to find customers who placed orders using a subquery.
CREATE TABLE customers (id INT, name VARCHAR(20)); CREATE TABLE orders (id INT, customer_id INT); INSERT INTO customers VALUES (1, 'Alice'), (2, 'Bob'), (3, 'Carol'); INSERT INTO orders VALUES (101, 1), (102, 2), (103, 1); -- Using JOIN SELECT customers.name, orders.id AS order_id FROM customers JOIN orders ON customers.id = orders.customer_id ORDER BY customers.name; -- Using Subquery SELECT name FROM customers WHERE id IN (SELECT customer_id FROM orders) ORDER BY name;
JOINs are usually faster for large datasets because they combine tables directly.
Subqueries can be easier to read for simple filtering but might be slower.
Use JOINs when you need columns from both tables in the result.
JOINs combine tables side-by-side using matching columns.
Subqueries run inside another query to filter or find values.
Choose JOINs for performance and subqueries for simplicity in some cases.
Practice
JOIN and a subquery in MySQL?Solution
Step 1: Understand the role of JOIN
A JOIN combines rows from two or more tables side-by-side based on a related column between them.Step 2: Understand the role of subqueries
A subquery is a query nested inside another query, often used to filter or find specific values before the main query runs.Final Answer:
JOIN combines tables side-by-side; subqueries run inside another query to filter or find values. -> Option CQuick Check:
JOIN = combine tables, Subquery = nested query [OK]
- Confusing JOINs as nested queries
- Thinking subqueries combine tables side-by-side
- Believing JOINs and subqueries have identical performance always
employees and departments on the column department_id?Solution
Step 1: Identify correct JOIN syntax
The correct JOIN syntax uses the ON keyword to specify the matching columns between tables.Step 2: Check each option
SELECT * FROM employees JOIN departments ON employees.department_id = departments.department_id; uses ON correctly. SELECT * FROM employees JOIN departments WHERE employees.department_id = departments.department_id; incorrectly uses WHERE instead of ON. SELECT * FROM employees, departments ON employees.department_id = departments.department_id; uses comma join but incorrectly adds ON. SELECT * FROM employees JOIN departments USING employees.department_id; misuses USING with full column name.Final Answer:
SELECT * FROM employees JOIN departments ON employees.department_id = departments.department_id; -> Option DQuick Check:
JOIN requires ON for matching columns [OK]
- Using WHERE instead of ON for JOIN condition
- Using comma join with ON clause
- Incorrect USING syntax with full column names
orders(order_id, customer_id, amount) and customers(customer_id, name), what will the following query return?SELECT name FROM customers WHERE customer_id IN (SELECT customer_id FROM orders WHERE amount > 100);
Solution
Step 1: Analyze the subquery
The subquery selects customer_id from orders where amount is greater than 100.Step 2: Analyze the main query
The main query selects names from customers where customer_id is in the list returned by the subquery.Final Answer:
Names of customers who have orders with amount greater than 100. -> Option AQuick Check:
Subquery filters customers by order amount [OK]
- Assuming all customers are returned
- Thinking it returns customers without orders
- Believing subquery causes syntax error
SELECT e.name, d.department_name FROM employees e JOIN departments d WHERE e.department_id = d.department_id;
Solution
Step 1: Check JOIN syntax
JOIN requires the ON keyword to specify the join condition between tables.Step 2: Identify the mistake
The query uses WHERE instead of ON to specify the join condition, which is incorrect syntax.Final Answer:
Missing ON keyword before the join condition. -> Option BQuick Check:
JOIN needs ON, not WHERE, for conditions [OK]
- Using WHERE instead of ON for JOIN
- Confusing HAVING with JOIN condition
- Assuming aliases cause error
SELECT name FROM customers WHERE customer_id IN (SELECT customer_id FROM orders);
Solution
Step 1: Understand the original subquery
The subquery selects customer_ids from orders, filtering customers who placed orders.Step 2: Translate to JOIN
Using JOIN on customer_id between customers and orders returns matching customers. DISTINCT is needed to avoid duplicates.Step 3: Evaluate options
SELECT DISTINCT c.name FROM customers c JOIN orders o ON c.customer_id = o.customer_id; uses JOIN with ON and DISTINCT correctly. SELECT c.name FROM customers c JOIN orders o WHERE c.customer_id = o.customer_id; misses ON keyword. SELECT c.name FROM customers c, orders o WHERE c.customer_id = o.customer_id; uses old-style join but is valid but may return duplicates. SELECT name FROM customers LEFT JOIN orders ON customer_id = customer_id; uses LEFT JOIN but ON condition is ambiguous.Final Answer:
SELECT DISTINCT c.name FROM customers c JOIN orders o ON c.customer_id = o.customer_id; -> Option AQuick Check:
JOIN with ON and DISTINCT matches subquery result [OK]
- Omitting ON keyword in JOIN
- Not using DISTINCT causing duplicates
- Using ambiguous ON conditions
Ready to prove it?
Pass the test and this pattern moves unknown
