Accéder au contenu principal
Documents
FonctionsExpressionsKeywordsDéclarationsClauses

Clause WITH de MySQL

La clause `WITH` de MySQL, souvent appelée Common Table Expressions (CTEs), vous permet de définir des ensembles de résultats temporaires qui peuvent être référencés dans une instruction `SELECT`, `INSERT`, `UPDATE`, ou `DELETE`. Il simplifie les requêtes complexes en les divisant en composants plus simples et réutilisables.

Utilisation

La clause `WITH` est utilisée lorsque vous avez besoin de créer un ou plusieurs tableaux temporaires qui peuvent être référencés tout au long d'une requête. Il est particulièrement utile pour améliorer la lisibilité et maintenir des requêtes complexes.

sql
WITH cte_name AS (
    SELECT column1, column2, ...
    FROM table_name
    WHERE condition
)
SELECT column1, column2, ...
FROM cte_name;

Dans cette syntaxe, `WITH cte_name AS (...)` définit un CTE qui encapsule un ensemble de résultats de requête, qui peut ensuite être utilisé dans la requête suivante. Notez que la clause `WITH` est supportée à partir de la version 8.0 de MySQL.

Exemples

1. CTE de base

sql
WITH recent_orders AS (
    SELECT order_id, order_date
    FROM orders
    WHERE order_date > '2023-01-01'
)
SELECT *
FROM recent_orders;

Cet exemple crée un CTE nommé `recent_orders` pour récupérer les commandes passées après le 1er janvier 2023, puis sélectionne toutes les colonnes de cet ensemble de résultats temporaire.

2. CTE avec Agrégation

sql
WITH sales_summary AS (
    SELECT customer_id, SUM(amount) AS total_sales
    FROM sales
    GROUP BY customer_id
)
SELECT customer_id, total_sales
FROM sales_summary
WHERE total_sales > 1000;

Ici, `sales_summary` est un CTE qui agrège les ventes totales par client, qui sont ensuite filtrées pour n'afficher que les clients dont les ventes sont supérieures à 1000.

3. CTE récursif

Un ETC récursif est un ETC qui se réfère à lui-même dans sa définition. Il est particulièrement utile pour l'interrogation de données hiérarchiques, telles que les structures organisationnelles ou les modèles de données arborescents.

sql
WITH RECURSIVE employee_hierarchy AS (
    SELECT employee_id, manager_id, 1 AS level
    FROM employees
    WHERE manager_id IS NULL
    UNION ALL
    SELECT e.employee_id, e.manager_id, eh.level + 1
    FROM employees e
    JOIN employee_hierarchy eh ON e.manager_id = eh.employee_id
)
SELECT employee_id, level
FROM employee_hierarchy;

Cet exemple utilise un CTE récursif pour construire une hiérarchie de salariés, en calculant le niveau de chaque salarié dans la hiérarchie, en commençant par ceux qui n'ont pas de responsable.

Conseils et bonnes pratiques

  • Nommez clairement les CTE. Utilisez des noms descriptifs pour les ETC afin de clarifier leur objectif et d'améliorer la lisibilité des requêtes.
  • Limiter la complexité des CTE. Évitez les CTE trop complexes ; décomposez-les en plusieurs CTE si nécessaire pour plus de clarté.
  • Tirez parti de la récursivité pour les hiérarchies. Utilisez des ETC récursifs pour naviguer dans des structures de données hiérarchiques, mais faites attention aux performances.
  • Performance du test. Les ETC peuvent améliorer la lisibilité mais peuvent affecter les performances ; testez en comparant les plans d'exécution avec d'autres structures d'interrogation et optimisez si nécessaire.

Différences entre les CTE et les tableaux dérivés

  • Les CTE sont définis à l'aide de la clause `WITH` et peuvent être référencés plusieurs fois dans la même requête, ce qui peut améliorer la lisibilité et la maintenabilité.
  • Les tableaux dérivés sont des sous-requêtes dans la clause `FROM` et sont généralement utilisés pour des scénarios plus simples et à usage unique.

Pièges potentiels et erreurs courantes

  • Veillez à ce que le nom de l'ETC soit unique dans la requête.
  • Évitez les récursions excessives dans les ETC récursifs, car elles peuvent entraîner des problèmes de performance.
  • Méfiez-vous des ETC qui introduisent une complexité inutile ou qui n'améliorent pas les performances de la requête.

Limitations

Les CTEs dans MySQL ont certaines limitations, comme le fait de ne pas pouvoir se référencer en dehors d'un contexte récursif ou d'utiliser certaines opérations comme `ORDER BY` sans une clause `LIMIT` dans des parties récursives.

Amélioration de SQL pour les débutants

Acquérir les compétences SQL pour interagir avec vos données et les interroger.
Commencez à apprendre gratuitement