DEV Community

Cover image for 📊Unlocking the power of SQL: Subqueries, CTEs, and Stored Procedures Demystified
Loi2008
Loi2008

Posted on

📊Unlocking the power of SQL: Subqueries, CTEs, and Stored Procedures Demystified

📝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
);
Enter fullscreen mode Exit fullscreen mode

🟢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;
Enter fullscreen mode Exit fullscreen mode

🟢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);
Enter fullscreen mode Exit fullscreen mode

🟢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

  1. 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

  2. LearnSQL.com – comprehensive overview of subqueries and CTEs with examples. https://learnsql.com/blog/cte-vs-subquery

  3. 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

  4. Wikipedia – Stored Procedure – in-depth explanation of stored procedures, use cases, and comparison with functions. https://en.wikipedia.org/wiki/Stored_procedure

  5. PostgreSQL stored procedures guide – syntax and use for transaction-aware routines.https://pysql.tecladocode.com/section08/lectures/04_stored_procedures

  6. Wikipedia – Correlated Subquery – explains execution patterns and performance considerations in correlated subqueries. https://en.wikipedia.org/wiki/Correlated_subquery

Top comments (0)