Cláusula WITH
1. Qué es la Cláusula WITH? #
La cláusula WITH en SQL se utiliza para definir consultas temporales o subconsultas que se pueden referenciar dentro de una consulta principal. Estas subconsultas se conocen como "Common Table Expressions" (CTE). La cláusula WITH mejora la legibilidad de las consultas y permite reutilizar el resultado de una subconsulta varias veces.
2. ¿Por qué usar la cláusula WITH? #
Se utiliza principalmente para:
- Simplificar consultas complejas, dividiéndolas en partes más manejables.
- Mejorar la legibilidad de las consultas al nombrar subconsultas.
- Reutilizar subconsultas dentro de la misma consulta.
A continuación, veremos cómo usar la cláusula WITH y algunos ejemplos prácticos.
3. Sintaxis Básica de la Cláusula WITH #
La sintaxis básica para usar la cláusula WITH es:
1WITH nombre_cte AS ( 2 subconsulta 3) 4SELECT * FROM nombre_cte;
nombre_ctees el nombre que le das a la subconsulta.subconsultaes la consulta que deseas realizar y que será utilizada en la consulta principal.
4. Ejemplo Básico de la Cláusula WITH #
Imagina que tienes una tabla de empleados con columnas como id, nombre, departamento y salario. Ahora, queremos encontrar el salario promedio por departamento y luego obtener los empleados cuyo salario es mayor que el promedio de su departamento.
Tabla empleados:
| id | nombre | departamento | salario |
|---|---|---|---|
| 1 | Juan | Ventas | 3000 |
| 2 | Ana | Marketing | 4000 |
| 3 | Pedro | Ventas | 2500 |
| 4 | Maria | Marketing | 3500 |
| 5 | Luis | Ventas | 3200 |
Consulta con WITH:
1WITH salario_promedio AS ( 2 SELECT departamento, AVG(salario) AS promedio 3 FROM empleados 4 GROUP BY departamento 5) 6SELECT e.nombre, e.salario, e.departamento 7FROM empleados e 8JOIN salario_promedio sp ON e.departamento = sp.departamento 9WHERE e.salario > sp.promedio;
Explicación:
salario_promedioes una CTE que calcula el salario promedio por departamento.- Luego, en la consulta principal, se utiliza la CTE
salario_promediopara comparar el salario de cada empleado con el promedio de su departamento.
Resultado esperado:
| nombre | salario | departamento |
|---|---|---|
| Juan | 3000 | Ventas |
| Luis | 3200 | Ventas |
| Ana | 4000 | Marketing |
5. Cláusula WITH con Múltiples CTEs #
También puedes usar la cláusula WITH para definir varias CTEs dentro de la misma consulta. Esto puede ser útil cuando necesitas realizar múltiples subconsultas interrelacionadas.
Sintaxis:
1WITH cte1 AS ( 2 subconsulta1 3), 4cte2 AS ( 5 subconsulta2 6) 7SELECT * FROM cte1 8JOIN cte2 ON cte1.columna = cte2.columna;
Ejemplo:
Supongamos que tienes las tablas productos y ventas, y quieres calcular el total de ventas por producto y luego obtener los productos con ventas superiores a un valor específico.
Tablas productos y ventas:
| id_producto | nombre_producto | precio |
|---|---|---|
| 1 | Laptop | 1000 |
| 2 | Smartphone | 500 |
| id_venta | id_producto | cantidad |
|---|---|---|
| 1 | 1 | 5 |
| 2 | 2 | 10 |
Consulta con múltiples CTEs:
1WITH total_ventas AS ( 2 SELECT id_producto, SUM(cantidad) AS total_vendido 3 FROM ventas 4 GROUP BY id_producto 5), 6productos_con_ventas AS ( 7 SELECT p.id_producto, p.nombre_producto, p.precio, tv.total_vendido 8 FROM productos p 9 JOIN total_ventas tv ON p.id_producto = tv.id_producto 10) 11SELECT nombre_producto, total_vendido, precio 12FROM productos_con_ventas 13WHERE total_vendido > 8;
Explicación:
total_ventases una CTE que calcula el total de productos vendidos por cadaid_producto.productos_con_ventases otra CTE que une los datos deproductoscon el total de ventas calculado en la CTE anterior.- Finalmente, la consulta principal filtra los productos que se han vendido más de 8 veces.
Resultado esperado:
| nombre_producto | total_vendido | precio |
|---|---|---|
| Smartphone | 10 | 500 |
6. Ventajas de Usar la Cláusula WITH #
- Mejor Legibilidad: Las consultas complejas se pueden dividir en partes más fáciles de entender.
- Reutilización de Subconsultas: Puedes reutilizar el resultado de una subconsulta varias veces sin necesidad de repetir la misma lógica.
- Simplicidad en Consultas Anidadas: Las CTEs simplifican las consultas anidadas al hacer que el código sea más limpio y organizado.
7. Consideraciones Importantes #
- Las CTEs son temporales y solo existen durante la ejecución de la consulta. Una vez que la consulta ha terminado, las CTEs desaparecen.
- Algunas bases de datos pueden tener limitaciones sobre el uso de CTEs recursivas, que se utilizan para realizar consultas sobre datos jerárquicos (como árboles de empleados o categorías de productos).
Resumen del tema
Conceptos clave #
- Cláusula
WITH(Common Table Expression / CTE): define conjuntos de resultados temporales nombrados que existen únicamente durante la ejecución de la consulta principal. - Legibilidad y Mantenimiento: permite estructurar consultas complejas en pasos lógicos secuenciales más comprensibles que las subconsultas anidadas.
- Reutilización: una misma CTE puede referenciarse múltiples veces dentro de la consulta principal o en CTEs posteriores.
- CTEs Recursivas (
WITH RECURSIVE): permiten recorrer y consultar estructuras de datos jerárquicas y en árbol (organigramas, categorías padre/hijo, grafos).
Qué debes recordar #
La cláusula WITH transforma consultas complejas y anidadas en bloques modulares y legibles que facilitan el mantenimiento y permiten el procesamiento recursivo de jerarquías.