Saltar al contenido principal
Documentos
FuncionesExpresionesKeywordsDeclaracionesCláusulas

Cláusula WITH de MySQL

La cláusula `WITH` de MySQL, a menudo denominada expresiones comunes de tabla (CTE), te permite definir conjuntos de resultados temporales a los que se puede hacer referencia dentro de una sentencia `SELECT`, `INSERT`, `UPDATE` o `DELETE`. Simplifica las consultas complejas dividiéndolas en componentes más sencillos y reutilizables.

Utilización

La cláusula "CON" se utiliza cuando necesitas crear una o varias tablas temporales a las que se pueda hacer referencia a lo largo de una consulta. Es especialmente útil para mejorar la legibilidad y mantener consultas complejas.

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

En esta sintaxis, `WITH cte_name AS (...)` define una CTE que encapsula un conjunto de resultados de consulta, que puede utilizarse en la consulta posterior. Ten en cuenta que la cláusula `WITH` es compatible a partir de la versión 8.0 de MySQL.

Ejemplos

1. CTE Básico

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

Este ejemplo crea una CTE denominada `pedidos_recientes` para recuperar los pedidos realizados después del 1 de enero de 2023 y, a continuación, selecciona todas las columnas de este conjunto de resultados temporal.

2. CTE con Agregación

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;

Aquí, `sales_summary` es un CTE que agrega las ventas totales por cliente, que luego se filtra para mostrar sólo los clientes con ventas superiores a 1000.

3. CTE recursivo

Un CTE recursivo es un CTE que se referencia a sí mismo dentro de su definición. Es especialmente útil para consultar datos jerárquicos, como estructuras organizativas o modelos de datos en forma de árbol.

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;

Este ejemplo utiliza un CTE recursivo para construir una jerarquía de empleados, calculando el nivel de cada empleado en la jerarquía empezando por los que no tienen jefe.

Consejos y buenas prácticas

  • Nombra claramente los CTE. Utiliza nombres descriptivos para las CTEs para aclarar su finalidad y mejorar la legibilidad de las consultas.
  • Limitar la complejidad del CTE. Evita los CTE demasiado complejos; divídelos en varios CTE si es necesario para mejorar la claridad.
  • Aprovecha la Recursión para las Jerarquías. Utiliza CTE recursivas para navegar por estructuras de datos jerárquicas, pero ten en cuenta el rendimiento.
  • Rendimiento de la prueba. Las CTE pueden mejorar la legibilidad, pero pueden afectar al rendimiento; compruébalo comparando los planes de ejecución con otras estructuras de consulta y optimízalos según sea necesario.

Diferencias entre CTEs y Tablas Derivadas

  • Las CTE se definen mediante la cláusula `WITH` y se puede hacer referencia a ellas varias veces dentro de la misma consulta, lo que puede mejorar la legibilidad y la capacidad de mantenimiento.
  • Las Tablas Derivadas son subconsultas de la cláusula `FROM` y se suelen utilizar para situaciones más sencillas y de un solo uso.

Peligros potenciales y errores comunes

  • Asegúrate de que el nombre del CTE es único dentro de la consulta.
  • Evita la recursividad excesiva en las CTE recursivas, ya que puede provocar problemas de rendimiento.
  • Ten cuidado con las CTE que introducen una complejidad innecesaria o no mejoran el rendimiento de la consulta.

Limitaciones

Los CTEs en MySQL tienen ciertas limitaciones, como no poder referenciarse a sí mismos fuera de un contexto recursivo o utilizar ciertas operaciones como `ORDENAR POR` sin una cláusula `LÍMITE` en partes recursivas.

Perfeccionamiento de SQL para principiantes

Adquiere los conocimientos de SQL para interactuar con tus datos y consultarlos.
Empieza a aprender gratis