AccueilGlossaire › CTE (Common Table Expression)

CTE (Common Table Expression)

Data

Requête nommée temporaire améliorant lisibilité et permettant recursion en SQL.

Common Table Expression (CTE) est une requête nommée temporaire (existing pour la durée d'une seule statement) définie via clause `WITH` en SQL standard. Améliore lisibilité de queries complex en décomposant en blocks logiques, et active recursive queries (impossible avec subqueries classiques).

Syntaxe basique :
```sql
WITH active_users AS (
SELECT user_id, name FROM users WHERE active = true
),
recent_orders AS (
SELECT user_id, COUNT(*) AS count FROM orders
WHERE created_at > NOW() - INTERVAL '30 days'
GROUP BY user_id
)
SELECT au.name, ro.count
FROM active_users au
LEFT JOIN recent_orders ro ON au.user_id = ro.user_id;
```

Avantages :
(1) **Readability** — break complex query in named pieces, top-to-bottom flow vs nested subqueries.
(2) **Reusable** — same CTE referenced multiple times in main query.
(3) **Recursive queries** — hierarchical data (org charts, tree structures, graph traversal).
(4) **Debugging** — comment out parts easily.

Recursive CTE exemple — org chart :
```sql
WITH RECURSIVE org AS (
SELECT id, name, manager_id, 1 AS level FROM employees WHERE manager_id IS NULL
UNION ALL
SELECT e.id, e.name, e.manager_id, o.level + 1
FROM employees e JOIN org o ON e.manager_id = o.id
)
SELECT * FROM org ORDER BY level;
```
Recursive CTE utiles : hierarchies, tree traversal, graph shortest path, generate series, fibonacci sequences, etc.

Support :
- PostgreSQL : excellent, materialized vs not-materialized hints (CTE_MATERIALIZED flag).
- MySQL : depuis 8.0.
- SQL Server : depuis 2005.
- Oracle : depuis 9i (avec recursion sub-syntax different).
- MariaDB : depuis 10.2.
- SQLite : depuis 3.8.3.

Performance considérations : (1) **Postgres** avant 12 — CTEs were optimization fence (materialized always). Now `MATERIALIZED` keyword explicit ; default inlined like subquery. (2) **Other DBs** typically inline CTEs into main query for optimizer flexibility. (3) **Recursive CTEs** can be expensive — careful with cycles (use UNION (vs UNION ALL) to dedupe), depth limits.

Alternatives historiques : nested subqueries (less readable), temp tables (more overhead, persistent), views (permanent objects). CTE le sweet spot pour many cases. Compétences DP-300, DEA-C01.

Certifications qui couvrent ce concept
DP-300 DEA-C01
Termes liés
SQL (Structured Query Language) Window Function (SQL Analytic Function) Materialized View

Préparez vos certifications IT gratuitement

200+ certifications, 400 000+ questions, examens blancs chronométrés.

Voir le catalogue →
← Retour au glossaire