Useful Data Tips

CTEs vs Subqueries: When to Use Each

⏱️ 35 sec read 📊 SQL

CTEs (Common Table Expressions) and subqueries solve similar problems but with different advantages.

Subquery Example

SELECT u.name,
       (SELECT COUNT(*) FROM orders WHERE user_id = u.id) as order_count
FROM users u
WHERE (SELECT COUNT(*) FROM orders WHERE user_id = u.id) > 5;

Problem: Same subquery runs twice. Hard to read and maintain.

CTE Example

WITH order_counts AS (
  SELECT user_id, COUNT(*) as order_count
  FROM orders
  GROUP BY user_id
)
SELECT u.name, oc.order_count
FROM users u
JOIN order_counts oc ON u.id = oc.user_id
WHERE oc.order_count > 5;

Benefits: Named, reusable, easier to debug.

When to Use CTEs

When to Use Subqueries

Performance Note

Both are usually optimized to the same execution plan. Choose based on readability, not performance.

Best Practice: Use CTEs for anything you'd want to name and reuse. Use subqueries for quick, one-off calculations.

← Back to SQL Tips