#1 Data Analytics Program in India
₹2,499₹1,499Enroll Now
Step 17
4 min read

Common Table Expressions (CTE)

Learn WITH clause - create temporary named result sets for cleaner queries.

What is a CTE?

CTE vs Subquery
AspectSubqueryCTE
ReadabilityHardEasy
ReusableNoYes
DebuggingDifficultEasy
3 rows

A temporary named result that exists only during your query.

Syntax

CTE vs Subquery
AspectSubqueryCTE
ReadabilityHardEasy
ReusableNoYes
DebuggingDifficultEasy
3 rows
WITH temp_name AS ( SELECT ... ) SELECT * FROM temp_name;

Example: Before and After

CTE vs Subquery
AspectSubqueryCTE
ReadabilityHardEasy
ReusableNoYes
DebuggingDifficultEasy
3 rows

Without CTE (nested, hard to read):

SELECT * FROM ( SELECT * FROM (SELECT * FROM students WHERE age > 18) WHERE grade = 'A' ) WHERE score > 90;

With CTE (clean steps):

WITH adults AS ( SELECT * FROM students WHERE age > 18 ), grade_a AS ( SELECT * FROM adults WHERE grade = 'A' ) SELECT * FROM grade_a WHERE score > 90;

Real Example

CTE vs Subquery
AspectSubqueryCTE
ReadabilityHardEasy
ReusableNoYes
DebuggingDifficultEasy
3 rows
WITH customer_stats AS ( SELECT customer_id, SUM(total) AS spent FROM orders GROUP BY customer_id ) SELECT c.name, cs.spent FROM customers c JOIN customer_stats cs ON c.id = cs.customer_id WHERE cs.spent > 1000;

Summary

CTE vs Subquery
AspectSubqueryCTE
ReadabilityHardEasy
ReusableNoYes
DebuggingDifficultEasy
3 rows
  • WITH: Creates temporary named result
  • Makes complex queries readable
  • Can create multiple CTEs
  • Better than nested subqueries

Finished this topic?

Mark it complete to track your progress and maintain your streak!