Modelado físico relacional de bases de datos
¿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.
¿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.
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.
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 |
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 |
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.
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).
- Loading...