Nested Queries in SQL

A nested query (subquery) is a query placed inside another query. The inner query executes first and its result is used by the outer query for more complex data retrieval.

Syntax

SELECT column1, column2
FROM table1
WHERE column1 IN (
    SELECT column1
    FROM table2
    WHERE condition
);

Types of Nested Queries

Non-Correlated Inner runs independently Result passed to outer Operators: IN, NOT IN, ALL, ANY Correlated Inner uses outer row values Runs once per outer row Operators: EXISTS, NOT EXISTS

Sample Tables

-- employees: emp_id, emp_name, dept_id
-- (1,John,1), (2,Mary,2), (3,Bob,1), (4,Alice,3), (5,Tom,1)

-- departments: dept_id, dept_name
-- (1,Sales), (2,Marketing), (3,Finance)

-- sales: sale_id, emp_id, sale_amt
-- (1,1,1000),(2,2,2000),(3,3,3000),(4,1,4000),(5,5,5000),(6,3,6000),(7,2,7000)

Example 1: Non-Correlated (IN)

Find employees in the Sales department ?

SELECT emp_name
FROM employees
WHERE dept_id IN (
    SELECT dept_id FROM departments WHERE dept_name = 'Sales'
);
+----------+
| emp_name |
+----------+
| John     |
| Bob      |
| Tom      |
+----------+

Example 2: Correlated (EXISTS)

Find employees who have made at least one sale ?

SELECT emp_name
FROM employees e
WHERE EXISTS (
    SELECT 1 FROM sales s WHERE e.emp_id = s.emp_id
);
+----------+
| emp_name |
+----------+
| John     |
| Mary     |
| Bob      |
| Tom      |
+----------+

Alice is excluded because she has no record in the sales table.

Example 3: ALL Operator

Find employees whose ID matches all sale records above $1000 ?

SELECT emp_name
FROM employees
WHERE emp_id = ALL (
    SELECT emp_id FROM sales WHERE sale_amt > 5000
);

Operators Summary

Operator Type Usage
IN Non-correlated Value matches any in subquery result
NOT IN Non-correlated Value not in subquery result
ANY Both True if comparison matches any value
ALL Both True if comparison matches all values
EXISTS Correlated True if subquery returns at least one row
NOT EXISTS Correlated True if subquery returns no rows

Conclusion

Nested queries allow complex data retrieval by embedding one query inside another. Non-correlated subqueries run independently and pass results to the outer query, while correlated subqueries reference outer query values and execute per row. Use IN/ALL/ANY for independent subqueries and EXISTS for correlated ones.

Updated on: 2026-03-14T22:13:55+05:30

37K+ Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements