What if you could ask a question inside another question and get the answer instantly?
Why subqueries nest queries in MySQL - The Real Reasons
Imagine you have a huge list of customers and orders in separate sheets. You want to find customers who placed orders over $100. Manually flipping between sheets, matching names, and checking amounts is confusing and slow.
Doing this by hand or with simple queries means copying data back and forth, risking mistakes and wasting time. You might miss some matches or mix up data because it's hard to keep track of everything at once.
Subqueries let you put one question inside another, like nesting boxes. This means you can ask for orders over $100 first, then use that result to find matching customers automatically, all in one smooth step.
SELECT customer_name FROM customers; -- Then separately check orders over $100 and match manually
SELECT customer_name FROM customers WHERE customer_id IN (SELECT customer_id FROM orders WHERE amount > 100);It lets you combine multiple steps into one clear, powerful query that finds exactly what you need without extra work.
A store manager quickly finds all customers who bought expensive items last month by nesting queries, saving hours of manual checking.
Manual matching of related data is slow and error-prone.
Subqueries nest one query inside another to automate this matching.
This makes complex data questions simple and fast to answer.
Practice
SELECT * FROM employees WHERE department_id IN (SELECT id FROM departments WHERE location = 'NY');Solution
Step 1: Understand subquery usage
The inner querySELECT id FROM departments WHERE location = 'NY'finds department IDs in New York.Step 2: Use subquery results in outer query
The outer query selects employees whosedepartment_idmatches those IDs from the subquery.Final Answer:
To nest one query inside another and use its results -> Option AQuick Check:
Subqueries = nested queries using results [OK]
- Thinking subqueries change database structure
- Confusing subqueries with hardware upgrades
- Believing subqueries create tables automatically
Solution
Step 1: Check subquery syntax
Subqueries must be enclosed in parentheses and used with operators like = or IN.Step 2: Identify correct syntax
SELECT * FROM table1 WHERE id = (SELECT id FROM table2 WHERE condition); uses parentheses correctly and the = operator, which is valid syntax.Final Answer:
SELECT * FROM table1 WHERE id = (SELECT id FROM table2 WHERE condition); -> Option DQuick Check:
Subquery syntax requires parentheses [OK]
- Using double equals (==) instead of single equals (=)
- Omitting parentheses around subquery
- Using IN without parentheses
SELECT name FROM employees WHERE department_id IN (SELECT id FROM departments WHERE location = 'LA');
Given:
- departments table has ids 1,2,3 with locations NY, LA, LA respectively
- employees table has:
(name: Alice, department_id: 1),
(name: Bob, department_id: 2),
(name: Carol, department_id: 3),
(name: Dave, department_id: 4)
Solution
Step 1: Identify department IDs in LA
From departments, IDs with location 'LA' are 2 and 3.Step 2: Find employees in those departments
Employees with department_id 2 and 3 are Bob and Carol.Final Answer:
Bob, Carol -> Option AQuick Check:
Subquery filters departments = Bob, Carol [OK]
- Including employees from other departments
- Ignoring subquery filtering
- Assuming all employees are returned
SELECT name FROM employees WHERE department_id = SELECT id FROM departments WHERE location = 'NY';
Solution
Step 1: Check subquery syntax
The subquery must be enclosed in parentheses to be valid.Step 2: Identify missing parentheses
The query lacks parentheses aroundSELECT id FROM departments WHERE location = 'NY'.Final Answer:
Missing parentheses around the subquery -> Option CQuick Check:
Subqueries need parentheses [OK]
- Forgetting parentheses causes syntax error
- Confusing = and IN without checking subquery results
- Assuming table names are incorrect without checking
Solution
Step 1: Understand the problem
We want employees earning more than their department's average salary.Step 2: Analyze subquery usage
SELECT name, salary FROM employees e WHERE salary > (SELECT AVG(salary) FROM employees WHERE department_id = e.department_id); uses a correlated subquery that calculates average salary per employee's department.Step 3: Check other options
SELECT name, salary FROM employees WHERE salary > AVG(salary); lacks grouping, C compares salary to all salaries, D compares to all averages without correlation.Final Answer:
SELECT name, salary FROM employees e WHERE salary > (SELECT AVG(salary) FROM employees WHERE department_id = e.department_id); -> Option BQuick Check:
Correlated subquery per department = SELECT name, salary FROM employees e WHERE salary > (SELECT AVG(salary) FROM employees WHERE department_id = e.department_id); [OK]
- Using aggregate functions without grouping
- Not correlating subquery with outer query
- Comparing salary to unrelated values
Ready to prove it?
Pass the test and this pattern moves unknown
