SQL Subqueries

Using nested queries

Subquery in WHERE

SELECT * FROM users
WHERE age > (SELECT AVG(age) FROM users); # subquery returns single value

Subquery with IN

SELECT * FROM products
WHERE category_id IN (
    SELECT id FROM categories WHERE active = 1
); # subquery returns multiple values

Subquery in FROM

SELECT avg_price
FROM (
    SELECT AVG(price) AS avg_price FROM products GROUP BY category
) AS subquery; # derived table

Correlated Subquery

SELECT name, salary
FROM employees e1
WHERE salary > (
    SELECT AVG(salary) FROM employees e2
    WHERE e1.department = e2.department
); # references outer query

EXISTS

SELECT * FROM users u
WHERE EXISTS (
    SELECT 1 FROM orders o WHERE o.user_id = u.id
); # check if exists