Correlated subqueries are inner queries that reference columns from the outer query. They execute once per outer row, making them perfect for row-aware comparisons like βemployees earning above their department average.β
SELECT column_list
FROM table1 outer
WHERE outer.column > (
SELECT AVG(inner.column)
FROM table2 inner
WHERE inner.key = outer.key
);
| Employees | Departments |
|---|---|
| EmpID, EmpName, DeptID, Salary | DeptID, DeptName |
| 1 β Suresh β 10 β 60000 | 10 β HR |
| 2 β Priya β 10 β 80000 | 20 β IT |
| 3 β Raj β 20 β 55000 | 30 β Finance |
| 4 β Anil β 20 β 70000 | |
| 5 β Meena β 30 β 90000 |
SELECT e.EmpName, e.Salary, e.DeptID
FROM Employees e
WHERE e.Salary > (
SELECT AVG(e2.Salary)
FROM Employees e2
WHERE e2.DeptID = e.DeptID
);
Returns Priya, Anil, and Meena.
SELECT e.EmpName, e.Salary, e.DeptID
FROM Employees e
WHERE e.Salary = (
SELECT MAX(e2.Salary)
FROM Employees e2
WHERE e2.DeptID = e.DeptID
);
SELECT DISTINCT d.DeptName
FROM Departments d
WHERE EXISTS (
SELECT 1
FROM Employees e
WHERE e.DeptID = d.DeptID
AND e.Salary > 75000
);
SELECT e1.EmpName, e1.Salary
FROM Employees e1
WHERE e1.Salary > ALL (
SELECT e2.Salary
FROM Employees e2
WHERE e2.DeptID = e1.DeptID
AND e2.EmpName <> e1.EmpName
);
UPDATE Employees e
SET e.Salary = e.Salary * 1.10
WHERE e.Salary < (
SELECT AVG(e2.Salary)
FROM Employees e2
WHERE e2.DeptID = e.DeptID
);
| Tip | Description |
|---|---|
| Avoid on huge datasets | Correlated subqueries execute per row, causing repeated scans. |
| Prefer joins/CTEs | Many patterns can be rewritten with JOIN or WITH. |
| Index foreign keys | Boosts lookup speed for the inner query. |
| Use EXISTS over IN | EXISTS short-circuits as soon as a match is found. |
| Leverage analytics | AVG() OVER (PARTITION BY DeptID) often replaces correlated logic. |
SELECT EmpName, Salary, DeptID
FROM (
SELECT e.*, AVG(Salary) OVER (PARTITION BY DeptID) AS DeptAvg
FROM Employees e
) t
WHERE Salary > DeptAvg;
Identify staff earning above department averages or below thresholds.
Spot stores outperforming regional averages.
Detect items priced above category norms.
Cross-check payload data based on related table conditions.
DeptID) to reduce re-execution cost.