MySQL Subqueries

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.