A subquery (also called an inner query or nested query) is a SQL query written inside another SQL query. The result of the subquery is used by the outer (main) query to perform further operations. Subqueries help solve complex problems in a clean and logical way when a query depends on the result of another query.
Subqueries are widely used in filtering data, comparisons, calculations, and existence checks. They are especially useful when you need intermediate results without creating temporary tables.
( )WHERE clauseFROM clauseSELECT clauseHAVING clauseSELECT first_name, last_name, salary
FROM employees
WHERE salary > (
SELECT AVG(salary) FROM employees
);
SELECT first_name, last_name, department
FROM employees
WHERE department IN (
SELECT department_name
FROM departments
WHERE location = 'New York'
);
SELECT dept_avg.department, dept_avg.avg_salary
FROM (
SELECT department, AVG(salary) AS avg_salary
FROM employees
GROUP BY department
) AS dept_avg
WHERE dept_avg.avg_salary > (
SELECT AVG(salary) FROM employees
);
FROM clause acts like a temporary table.SELECT e1.first_name, e1.last_name, e1.department, e1.salary
FROM employees e1
WHERE e1.salary > (
SELECT AVG(e2.salary)
FROM employees e2
WHERE e2.department = e1.department
);
e1.department)SELECT d.department_name, d.location
FROM departments d
WHERE EXISTS (
SELECT 1
FROM employees e
WHERE e.department = d.department_name
);
EXISTS checks whether the subquery returns any rows| EXISTS | IN |
|---|---|
| Faster for large data | Slower for large lists |
| Checks row existence | Compares values |
| Uses correlation | Uses list |
A scalar subquery returns exactly one value.
SELECT first_name, salary,
(SELECT AVG(salary) FROM employees) AS company_avg
FROM employees;
SELECT department, AVG(salary) AS avg_salary
FROM employees
GROUP BY department
HAVING AVG(salary) > (
SELECT AVG(salary) FROM employees
);
Exception: Correlated subqueries execute row-by-row.
| Subquery | JOIN |
|---|---|
| Easier to understand | Better performance |
| Step-wise logic | More efficient |
| Slower on large data | Preferred in real-time apps |
Rule of Thumb:
Use subqueries for clarity, JOINs for performance.
= instead of IN