SQL Subqueries
Overview
Subqueries are queries nested inside other SQL queries. They can appear in WHERE, FROM, SELECT clauses, enabling complex data retrieval logic to be completed in a single SQL statement.
WHERE Subqueries
IN Subquery
IN checks if a value exists in the result set returned by the subquery:
sql
-- Query all products in the "Electronics" category
SELECT * FROM products
WHERE category_id IN (
SELECT id FROM categories WHERE name = 'Electronics'
);NOT IN Subquery
NOT IN excludes values in the subquery result:
sql
-- Query users who have no cancelled orders
SELECT * FROM users
WHERE id NOT IN (
SELECT user_id FROM orders WHERE status = 'cancelled'
);EXISTS Subquery
EXISTS checks if the subquery returns at least one row:
sql
-- Query users who have at least one order
SELECT * FROM users u
WHERE EXISTS (
SELECT 1 FROM orders o WHERE o.user_id = u.id
);NOT EXISTS Subquery
NOT EXISTS checks if the subquery returns no data:
sql
-- Query products with no reviews
SELECT * FROM products p
WHERE NOT EXISTS (
SELECT 1 FROM reviews r WHERE r.product_id = p.id
);FROM Subqueries (Derived Tables)
Subqueries can be placed in the FROM clause as temporary tables:
sql
-- Query category statistics with more than 10 products
SELECT * FROM (
SELECT
category,
COUNT(*) AS product_count,
AVG(price) AS avg_price
FROM products
GROUP BY category
) AS category_stats
WHERE product_count > 10;SELECT Subqueries (Scalar Subqueries)
Subqueries can be placed in the SELECT clause as computed columns:
sql
-- Query each user with their order count
SELECT
name,
(SELECT COUNT(*) FROM orders WHERE user_id = users.id) AS order_count
FROM users;Correlated Subqueries
Correlated subqueries reference columns from the outer query and are re-executed for each row:
sql
-- Query the highest priced product in each category
SELECT p.* FROM products p
WHERE p.price = (
SELECT MAX(price)
FROM products
WHERE category = p.category
);Summary
Subquery key points:
WHEREclause can useIN,EXISTSoperators- Subqueries in
FROMclause are used as derived tables - Scalar subqueries in
SELECTclause are used for computed columns - Correlated subqueries reference outer query columns