What if your database could think step-by-step for you, saving hours of tedious work?
Why Correlated subquery execution model in SQL? - Purpose & Use Cases
Start learning this pattern below
Jump into concepts and practice - no test required
Imagine you have a big list of customers and their orders in separate tables. You want to find each customer's latest order date. Doing this by hand means checking every order for every customer one by one, which is slow and confusing.
Manually comparing each customer's orders is slow and easy to mess up. You might forget some orders or mix up dates. It takes a lot of time and effort, especially if the data grows bigger every day.
The correlated subquery lets the database automatically check each customer's orders one at a time, linking the outer query to the inner query. This way, it finds the latest order for each customer quickly and correctly without extra work from you.
For each customer: Find all orders Pick the latest date Write it down
SELECT customer_id, (SELECT MAX(order_date) FROM orders WHERE orders.customer_id = customers.customer_id) AS latest_order FROM customers;
This model lets you write simple queries that automatically handle complex row-by-row comparisons, making your data tasks faster and less error-prone.
A store manager wants to see the last purchase date for every customer to send personalized offers. Using correlated subqueries, the manager gets this info instantly without checking each order manually.
Manual checking of related data is slow and error-prone.
Correlated subqueries link outer and inner queries to compare rows easily.
This makes complex data retrieval simple and efficient.
Practice
Solution
Step 1: Understand subquery types
A correlated subquery depends on the outer query's current row to run.Step 2: Identify correlation
It uses columns from the outer query inside the subquery's WHERE clause.Final Answer:
A subquery that uses values from the outer query to filter results -> Option BQuick Check:
Correlated subquery = uses outer query values [OK]
- Thinking subquery runs once independently
- Confusing with JOIN operations
- Assuming it returns only aggregates
Solution
Step 1: Identify correlation in subquery
SELECT e.name FROM employees e WHERE e.salary > (SELECT AVG(salary) FROM employees WHERE department = e.department) uses 'e.department' inside the subquery, linking it to the outer query.Step 2: Check other options
SELECT e.name FROM employees e WHERE e.salary > (SELECT AVG(salary) FROM employees) has no reference to outer query in subquery; the option with 'salary > 50000' lacks a subquery and the JOIN option is not a subquery.Final Answer:
SELECT e.name FROM employees e WHERE e.salary > (SELECT AVG(salary) FROM employees WHERE department = e.department) -> Option AQuick Check:
Correlation needs outer query column inside subquery [OK]
- Missing outer query reference inside subquery
- Confusing JOIN with subquery
- Using subquery without correlation
employees(id, name, department, salary) and the query:SELECT e1.name FROM employees e1 WHERE e1.salary > (SELECT AVG(e2.salary) FROM employees e2 WHERE e2.department = e1.department);
What does this query return?
Solution
Step 1: Understand the subquery correlation
The subquery calculates average salary for the department of the current employee (e1.department).Step 2: Compare salaries
The outer query selects employees whose salary is greater than that department average.Final Answer:
Employees whose salary is above the average salary of their own department -> Option AQuick Check:
Salary > department average = Employees whose salary is above the average salary of their own department [OK]
- Assuming average is for all employees
- Ignoring the correlation condition
- Confusing with simple WHERE salary > value
SELECT c.customer_id FROM customers c WHERE c.orders_count > (SELECT AVG(o.orders_count) FROM orders o WHERE o.customer_id = c.customer_id);
Solution
Step 1: Analyze correlation
The subquery correctly uses 'c.customer_id' from the outer query in its WHERE clause.Step 2: Check aggregation and output
AVG(o.orders_count) is an aggregate that returns a single scalar value, even for customers with multiple orders.Final Answer:
The subquery references the outer query correctly; no error -> Option DQuick Check:
Subquery must return single value for comparison [OK]
- Thinking AVG returns multiple rows without GROUP BY
- Assuming alias 'o' is undefined
- Believing SUM is needed instead of AVG
Solution
Step 1: Identify correlation condition
SELECT p.product_name FROM products p WHERE p.price > (SELECT AVG(price) FROM products WHERE category = p.category) uses 'p.category' inside the subquery to calculate average price per category, correlating outer and inner queries.Step 2: Verify other options
SELECT p.product_name FROM products p WHERE p.price > (SELECT AVG(price) FROM products) compares to overall average, not per category; the option using JOIN with categories uses a JOIN but no subquery; the option using > ALL compares to all individual prices, not average.Final Answer:
SELECT p.product_name FROM products p WHERE p.price > (SELECT AVG(price) FROM products WHERE category = p.category) -> Option CQuick Check:
Correlated subquery filters by category [OK]
- Using overall average instead of per category
- Confusing JOIN with subquery
- Using ALL instead of AVG in subquery
