Subquery adalah query di dalam query lain. Dievaluasi terlebih dahulu, hasilnya digunakan oleh query utama.
Scalar subquery (mengembalikan satu nilai):
SELECT * FROM products
WHERE price > (SELECT AVG(price) FROM products);
-- Produk yang harganya di atas rata-rata
IN subquery (mengembalikan daftar):
SELECT * FROM users
WHERE id IN (SELECT DISTINCT user_id FROM orders);
-- User yang pernah memesan
EXISTS subquery:
SELECT * FROM users u
WHERE EXISTS (
SELECT 1 FROM orders o WHERE o.user_id = u.id
);
-- Sama: user yang pernah memesan (lebih efisien untuk tabel besar)
NOT IN / NOT EXISTS:
SELECT * FROM users
WHERE id NOT IN (SELECT DISTINCT user_id FROM orders);
-- User yang BELUM pernah memesan
Subquery di SELECT:
SELECT name,
(SELECT COUNT(*) FROM posts WHERE posts.user_id = users.id) as post_count
FROM users;
-- Jumlah post per user (correlated subquery)