📝Introduction
In SQL, developers are often faced with situations where they are required to break down complex queries, reuse logic, or encapsulate business rules for repeated use. There are three powerful features that help manage complexity and improve efficiency, and each serves a different purpose:
- Subqueries - allow quick, inline calculations inside a query.
- Common Table Expressions (CTEs) - improve readability and support recursion within queries.
- Stored procedures - encapsulate reusable, parameterized business logic stored at the database level.
Understanding their similarities, differences, and best use cases is essential for writing efficient, maintainable SQL code.
1. Subquery
A subquery is a query nested inside another query. It can be used in the SELECT, FROM, or WHERE clause to provide intermediate results.
Example:
SELECT employee_name, salary
FROM employees
WHERE salary > (
SELECT AVG(salary)
FROM employees
);
🟢Best for: Quick, one-off filtering or calculations.
đź”´Limitation: Cannot be reused across queries and may affect performance if overused.
2. Common Table Expression (CTE)
A CTE is a temporary named result set defined with the **WITH **keyword. It improves readability and supports recursion.
Example:
WITH AvgSalary AS (
SELECT AVG(salary) AS avg_sal
FROM employees
)
SELECT employee_name, salary
FROM employees, AvgSalary
WHERE salary > avg_sal;
🟢Best for: Structuring complex queries, improving readability, and handling recursive scenarios like hierarchies.
đź”´Limitation: Exists only within the query scope and cannot be parameterized.
3. Stored Procedure
A stored procedure is a precompiled set of SQL statements stored in the database. It can accept parameters, perform multiple operations, and encapsulate business logic.
Example:
CREATE PROCEDURE GetHighEarners(IN minSalary DECIMAL(10,2))
BEGIN
SELECT employee_name, department, salary
FROM employees
WHERE salary > minSalary;
END;
CALL GetHighEarners(60000);
🟢Best for: Reusable routines, parameterized operations, and business logic encapsulation.
đź”´ Limitation: Requires database-level creation and maintenance.
Features
Feature | Subquery | CTE | Stored Procedure |
---|---|---|---|
Scope | Within a query | Within a query | Stored in the database |
Reusability | No | Only within same query | Yes (global) |
Parameters | No | No | Yes |
Supports Recursion | No | Yes | Yes |
Can Modify Data | Rarely (SELECT only) | Rarely (SELECT only) | Yes (INSERT/UPDATE/DELETE) |
Best Use | Simple inline logic | Complex query readability | Reusable business logic |
Where to use each
Subquery
- In a simple, one-off query.
- when filtering or aggregating values inside a query.
- ⚠️ Use correlated subqueries sparingly for performance reasons.
CTE
- When query logic is complex or needs recursion.
- Makes queries readable and maintainable.
- Ideal when the same subquery is referenced multiple times.
Stored Procedure
- When logic needs reusability across multiple queries.
- For data modification, business rules, or repetitive operations.
- When performance benefits from precompiled execution.
- When parameters or multiple operations are required in one call.
Conclusion
In SQL, stored procedures, CTEs, and subqueries are complementary tools. Subqueries are ideal for inline, fast processes; CTEs facilitate recursion and make difficult queries readable; and stored procedures contain reusable, parameterized business logic for routine tasks. Additionally, stored procedures bridge the gap between database architecture and programming principles by embodying abstraction, reusability, and modularity, much like Python functions do. By choosing the appropriate method for the appropriate situation, developers may create scalable, manageable, and effective SQL.
đź“– Further Reading & References
Gravell, M. Difference between CTE and subquery on Stack Overflow – highlights recursive capabilities of CTEs. https://stackoverflow.com/questions/706972/difference-between-cte-and-subquery
LearnSQL.com – comprehensive overview of subqueries and CTEs with examples. https://learnsql.com/blog/cte-vs-subquery
KDnuggets (April 2025): SQL CTE vs Subquery: This Debate Ain’t Over Yet – detailed comparison. https://www.kdnuggets.com/sql-cte-vs-subquery-this-debate-aint-over-yet
Wikipedia – Stored Procedure – in-depth explanation of stored procedures, use cases, and comparison with functions. https://en.wikipedia.org/wiki/Stored_procedure
PostgreSQL stored procedures guide – syntax and use for transaction-aware routines.https://pysql.tecladocode.com/section08/lectures/04_stored_procedures
Wikipedia – Correlated Subquery – explains execution patterns and performance considerations in correlated subqueries. https://en.wikipedia.org/wiki/Correlated_subquery
Top comments (0)