A Common Table Expression (CTE) in SQL is a temporary named result set that you can reference within a SELECT, INSERT, UPDATE, or DELETE statement.
It is defined using the WITH ... AS syntax.
Think of a CTE like a temporary view that exists only for the duration of the query.
✅ Basic Syntax
WITH cte_name AS (
SELECT column1, column2, ...
FROM some_table
WHERE condition
)
SELECT *
FROM cte_name;
📌 Example 1: Simple CTE
Suppose we have a table employees:
| emp_id | name | department | salary |
|---|---|---|---|
| 1 | Alice | HR | 5000 |
| 2 | Bob | IT | 7000 |
| 3 | Charlie | IT | 6000 |
| 4 | Diana | HR | 5500 |
| 5 | Eve | Finance | 6500 |
We want to get employees in IT earning more than 6000:
WITH HighPaidIT AS (
SELECT emp_id, name, salary
FROM employees
WHERE department = 'IT' AND salary > 6000
)
SELECT *
FROM HighPaidIT;
🔹 Result:
| emp_id | name | salary |
|---|---|---|
| 2 | Bob | 7000 |
📌 Example 2: Using CTE for Aggregation
Find the average salary per department, then list only departments with average salary > 6000:
WITH DeptAvg AS (
SELECT department, AVG(salary) AS avg_salary
FROM employees
GROUP BY department
)
SELECT *
FROM DeptAvg
WHERE avg_salary > 6000;
📌 Example 3: Recursive CTE
Recursive CTEs are useful for hierarchical data (like org charts or folder trees).
Example: Generate numbers from 1 to 5.
WITH RECURSIVE Numbers AS (
SELECT 1 AS n
UNION ALL
SELECT n + 1
FROM Numbers
WHERE n < 5
)
SELECT * FROM Numbers;
🔹 Result:
| n |
|---|
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
