A subquery is a query inside another query.
WHERE Subquery
SQL
SELECT name, score FROM students
WHERE score > (SELECT AVG(score) FROM students);EXISTS
SQL
SELECT s.name FROM students s
WHERE EXISTS (
SELECT 1 FROM enrollments e WHERE e.student_id = s.id
);Correlated Subquery
SQL
SELECT s.name, e.score,
e.score - (SELECT AVG(e2.score)
FROM enrollments e2
WHERE e2.course_id = e.course_id) AS diff_from_avg
FROM students s
JOIN enrollments e ON s.id = e.student_id;Subquery in FROM
SQL
SELECT * FROM (
SELECT course_id, student_id, score,
ROW_NUMBER() OVER (PARTITION BY course_id ORDER BY score DESC) AS rn
FROM enrollments
) ranked WHERE rn <= 3;Tips
- Use subqueries when a JOIN would be overly complex.
- Correlated subqueries run once per row — can be slow on large tables.
- Consider CTEs for readability when subqueries get nested.
Next: views.