SQL Server Mastery
Lesson 5 of 30 17% of course

Subqueries vs CTEs: Writing readable, high-performance code

20 · 8 min · 5/23/2026

Sign in to track progress and bookmarks.

CTEs vs Subqueries

Every senior developer has to decide: "Do I write a nested subquery, or do I use a Common Table Expression (CTE)?" While they often perform the same, CTEs are the gold standard for clean, maintainable enterprise SQL.

1. The CTE Advantage

A CTE acts like a temporary view that exists only for that query. It allows you to "Name" your intermediate results, making the code read like a story from top to bottom.

WITH TopSpendingUsers AS (
    SELECT UserID, SUM(Total) as Spend 
    FROM Orders GROUP BY UserID HAVING SUM(Total) > 1000
)
SELECT U.Email, TSU.Spend 
FROM Users U JOIN TopSpendingUsers TSU ON U.Id = TSU.UserID

2. Recursive CTEs

Subqueries cannot handle infinite hierarchies. CTEs can! Using the RECURSIVE keyword, a CTE can call itself, allowing you to walk down a family tree or an organizational chart in a single query.

4. Interview Mastery

Q: "Is a CTE faster than a Subquery?"

Architect Answer: "No. In modern SQL Server, the Query Optimizer treats them exactly the same. They are flattened into the same execution plan. The choice is purely about **Readability**. Use CTEs if you need to reuse the result multiple times in the same query or if you are building a recursive hierarchy. Use Subqueries only for very simple, one-off lookups inside a WHERE clause."

Test your knowledge

Quizzes linked to this course—pass to earn certificates.

Browse all quizzes
SQL Server Mastery

On this page

1. The CTE Advantage 2. Recursive CTEs 4. Interview Mastery
1. SQL Server Architecture & Basics
SQL Server Internals: How the Storage Engine works Relational Database Design & Normalization (1NF to 3NF) Data Types Mastery: Choosing the right type for performance
2. Advanced T-SQL Querying
Joins Deep Dive: Inner, Outer, Cross, and Self Joins Subqueries vs CTEs: Writing readable, high-performance code Window Functions: ROW_NUMBER, RANK, and LEAD/LAG Aggregations & Grouping Sets: Building complex reports Set Operators: UNION vs UNION ALL, INTERSECT, and EXCEPT
3. Indexing & Performance Tuning
Clustered vs Non-Clustered Indexes: The physical storage reality Covering Indexes & Included Columns: Reducing I/O costs Index Fragmentation: Why it happens and how to fix it Execution Plans: Reading the Query Optimizer's mind Statistics: Why 'Out of Date' stats kill performance SARGability: Writing queries that actually use indexes
4. Database Programmability
Stored Procedures: Security, Performance, and Best Practices User Defined Functions (UDF): Scalar vs Table-Valued Triggers: Auditing changes and the dangers of hidden logic Views & Indexed Views: Abstraction with performance Error Handling: TRY/CATCH and XACT_STATE()
5. Transactions & Concurrency
Transaction Isolation Levels: Read Uncommitted to Snapshot Locking & Blocking: Analyzing Deadlocks like a Pro Optimistic vs Pessimistic Concurrency
6. Administration & Security
SQL Server Security: Logins, Users, and Roles SQL Injection Prevention: Beyond simple parameterization Backup & Recovery Models: Full vs Simple vs Bulk-Logged Automating Maintenance: SQL Agent Jobs & Rebuilding Indexes
7. Modern SQL & Cloud
SQL Server & JSON: Storing and Querying semi-structured data Temporal Tables: Keeping track of data history automatically Introduction to Azure SQL: Database as a Service (PaaS) SQL Server Developer Interview: Junior to Senior Architect Level